我尝试在这里搜索类似的解决方案,但没有看到一个,所以我想知道完成以下操作的最佳方法是什么。
我有一张1700万行的表都有唯一的ID。我们最近创建了一个新表,它将与前一个表一起使用,其中新表的外键是旧表的唯一ID。
例如 表1 - id,field1,field2,field3 ...... 表2 - table1.id,field1 ...
问题是因为我们正在将其迁移到实时环境中,所以我们需要在表1中为表2中的每一行填充一个包含表1中id的行。 ex,表1 - 1,test,null 表2现在需要为table1中的每一行提供:1,null,...等等。主要问题是表1中的ID不是全部顺序的,因此我们必须从表1中读取,然后根据找到的id插入到表2中。
有没有更简单的方法可以解决这个问题? 提前致谢 乔
另外澄清一下,表2将是新数据,它将包含在表1中的唯一内容是保持外键关系的id
这也是sql server 2000
答案 0 :(得分:46)
如果我理解正确,你需要table2中的每条记录中的一条记录。 另外我相信除了对table1的引用之外,table2最初应该包含空行。
所以假设
table1 (ID, field1, field2, ...)
table2 (ID, table1_ID, fieldA, fieldB,...)
-- where table1_ID is a reference to ID of table1
创建table2后,您只需运行此插入语句
即可insert into table2(table1_ID)
select ID from table1
答案 1 :(得分:13)
我不确定我是否正在关注你,但这样的事情对你有用吗?
INSERT INTO table2 ( SELECT field1, field2, field3... FROM table1 )
如果我理解正确,你需要table2中记录table1中的每条记录。这样就可以了。只需按正确的顺序匹配select中的字段,并为table1中table1中没有的任何字段指定常量。
HTH。让我知道,如果我不理解,我会再次尝试帮助。
答案 2 :(得分:3)
您需要阅读这篇文章。
What are the most common SQL anti-patterns?
主要问题是表1中的id不是全部顺序的,因此我们必须从表1中读取,然后根据找到的id插入到表2中
是的,请看上面文章中的答案,并使用第2项编写一个键行走循环。
确保在编写insert语句时,提供了一个字段列表 - 正如我在第1项中所说的那样。
答案 3 :(得分:-1)
使用那么多行,您可能会遇到事务日志空间问题,以及运行大型插入事务的时间长度。
如果运行时间是一个约束,我会认真推荐使用Bcp(或者根据平台使用什么工具)
从原始表中选择id,使用它为扩展表构建Bcp文件,然后将其Bcp放入。
许多人发现,在10,000个记录的文件中,Bcp的性能更高,而不是一个包含17,000,000行的humungus文件。
此外,您可以在上线之前在后台执行此操作,并编写一个t-sql作业以便在您使用id的snapshop之后插入。