SQLSERVER如何导入数据保持ID不变(ID为自增主键)
使用SQL SERVER最操蛋的就是导入数据,以前用企业管理器直接导数据,导一次骂N次娘,在骂了微软无数次娘之后总结了一个方法揍合着还算受用。
其核心要点就是要将数据结构导入到目标数据库服务器上,再来导数据,如果直接使用sql企业管理器向目标数据库导入数据,就会发生一系列操蛋的问题:
ID不能自增了、ID改变了、主键索引被删了。
其实直接导还是有办法保持id主键自增、id不变的,就是到了编辑映射这一步,要依次选中每个表编辑映射,编辑sql,在id列加上PRIMARY KEY IDENTITY(1,1),然后勾选标识插入,这样导过去的数据和本地数据就是一样的,但是表多的话,修改sql相当蛋疼。
所以不得不说一句真TMD的操蛋,微软更新无数次数据库版本了还是没好好解决一下这个问题,就不能来个一键导入数据吗。
而实际使用中,可能附加数据库还比较常用,但是微软TMD不停的更新版本,导致个人电脑和公司电脑和服务器电脑,另外还可能会更换服务器,这些电脑上的版本不一样,就无法附加数据库,一般的技术人员可能很少用,但作为站长兼程序员的人,应该深有体会。
下文要说的就是先导入结构,再导入数据!
首先在源数据库上右键-任务-生成脚本,下一步,下一步,到了保存sql文件这里点高级,接下来有两种情况:
1:导出数据结构和数据(适合少量数据,几千条以内,数据多了脚本文件太大在sql软件上无法执行,要用sqlcmd,但这个工具要看人品,人品不好遇到一大堆操蛋的问题,还有另一个方法是osql,直接用win32 cmd执行sql文件,但速度慢,我上次几万条数据执行了20多分钟)。
首先,在高级里面找到为服务器版本编写脚本这项,右边选择你的服务器数据库版本,其次,找到要编写脚本的数据的类型这项,右边选择架构和数据。
然后点确定,继续下一步完成。
把生成的sql文件在你的服务器上的sql软件里面打开,根据需要可以修改一下脚本中的数据库地址,点击执行,就会自动创建数据库、表,然后导入数据(如果数据库存在,先删除)。
上面这种情况是你可以在服务器上删除、创建数据库,如果不能删除重新创建,那就要使用原先的数据库,所以在服务器上打开脚本找到alter database 把前面的代码全部删掉,接下来脚本中的数据库名称如果和服务器上的不一样就改一下,执行脚本。
注意一个问题:
如果数据库存在不能删除重建,那就删除数据库里面的表,删除代码中alter database前面的代码,修改脚本中的database名称,再执行。
2:仅导出结构。
导出结构后把代码考到服务器数据库上去执行,默认会创建数据库,所以如果数据库存在就先删除,不能删除的话,就删除里面的表,删除代码中alter database前面的代码,修改脚本中的database名称,再执行,这样就能在服务器上创建好数据库结构,接下来是导入数据。
如果是少量数据,可以到直接生成脚本,高级里面选择仅导出数据,然后在服务器上直接执行。
如果是大量数据,用sql企业管理器连接目标数据库(直接在本地数据库右键导出数据,再去连目标数据库也行),
右键导入数据,然后直到选择表源和源视图这里,勾选要导入的表和视图后,然后看看这些一一对应的表对应的行是不是选中状态(不是前面那个勾,是整行),点击下面的编辑映射:
如果是第一次导入数据,勾选启用标识插入,一直下一步就能导入成功。
如果不是第一次,表中有数据,就同时勾选删除现有表中的行和标识插入,或者把三个勾都勾上,这里值得一提的按我们人的正常理解可以勾选“删除并重新创建目标表和启用标识插入”就行了啊,表都删除重建了肯定旧数据不在了噻,但是TM不行,这样导入后之前的数据居然还存在,你说脑残不脑残,所以这里要么勾最后两个,要么三个全勾上。
顺便说一下:批量编辑映射这个功能好像只有sql2008及以上版本才有,之前使用sql2005还没有,只能一个表一个表的编辑映射,有几十个表的情况下你可以想象,基本上是修改一个表,骂一次娘。