tsql – 当行依赖外键值时如何使用BULK INSERT?
我的问题与
this one I asked on ServerFault有关.
基于此,我考虑使用 至于Streets表,它非常简单!我只有两个城市和五个部门需要关心作为外键.但那么,地址怎么样? Addresses表的结构如下: AddressId int not null identity(1,1) primary key StreetNumber int null NumberSuffix_Value int not null DEFAULT 0 StreetId int null references Streets (StreetId) CityId int not null references Cities (CityId) SectorId int null references Sectors (SectorId) 正如我在ServerFault上所说,我有大约35,000个地址要插入.我要记住所有的ID吗? = P 然后,我现在让公民人员插入与地址有关联的人. PersonId int not null indentity(1,1) primary key Surname nvarchar not null FirstName nvarchar not null IsActive bit AddressId int null references Addresses (AddressId) 我唯一能想到的就是强制ID为静态值,但是,我失去了以前使用INSERT..SELECT状态的方法所带来的灵活性. 那么我的选择是什么? >我强制ID始终相同,然后我必须设置IDENTITY_INSERT,以便我可以强制将值放入表中,这样我的每个行总是有相同的ID,就像建议的here一样. 谢谢你的帮助!
我准备好了我需要插入的信息的Excel工作簿.因此,我只是创建了一些补充工作表并开始编写公式,以便将信息数据“导入”到这些新工作表中.我的每个实体都有一个. >街道; 至于其他两个实体,不值得批量插入它们,因为我只有两个城市和五个扇区(城市细分)要插入.插入城市和部门后,我注意到他们各自的ID,并开始准备我的批量插入记录集.顺便说一句,利用Excel的强大功能来计算值并“导入”外键本身就是一种魅力.之后,我将每个工作表保存为单独的CSV文件.然后我的记录准备好了. USE [DatabaseName] GO delete from Citizens delete from Addresses delete from Streets BULK INSERT Streets FROM N'C:SomeFolderSomeSubfolderStreets.csv' WITH ( FIRSTROW = 2,KEEPIDENTITY,FIELDTERMINATOR = N',',ROWTERMINATOR = N'n',CODEPAGE = N'ACP' ) GO
至于其他参数,他们自己说. 现在解释了这一点,为剩下的两个实体中的每一个重复相同的代码以插入地址和公民.并且由于指定了KEEPIDENTITY,我的所有外键仍保持不变,尽管我的主键在SQL Server中设置为标识. 虽然只有一些调整,就像marc_s在他的回答中所说的那样,只需尽可能快地将数据导入到一个没有任何限制的临时表中.通过这种方式,你可以让你的生活更轻松,同时遵循良好的做法. =)
基本思想是将数据批量插入到没有任何限制,任何约束等的临时表中 – 只需尽可能快地批量加载数据.
在临时表中获得数据后,当您将临时表中的数据插入实际表时,需要开始担心约束等. 在这里,您可以例如 >只将那些行插入符合所有条件的实际工作表中(并在临时表中将它们标记为“已成功插入”) 关键点是:实际的BULK INSERT应该进入一个完全无约束的表 – 只需尽可能快地加载数据 – 然后在第二步开始担心约束和查找数据和引用和类似的东西 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |