在表中为每个ID在另一个表中插入行

问题描述:

我试着在这里搜索类似的解决方案,但没有看到一个,所以我想知道什么是完成以下的最佳方法。在表中为每个ID在另一个表中插入行

我有一张有1700万行的表格,都有一个唯一的ID。我们最近创建了一个新表,与新表的外键是旧表的唯一标识一起使用。

例如,
表1 - ID,字段1,字段2,字段3 ... 表2 - table1.id,字段1 ...

的问题,因为我们迁移到实际环境中,我们需要回填表2,其中包含表1中每行的id的行。 ex,表1-1,test,null 表2现在需要具有:1,null,...以此类推在table1中。主要问题是表1中的ID不是全部顺序,所以我们必须从表1读取,然后根据找到的ID插入到表2中。

有没有更简单的方法可以解决这个问题? 在此先感谢 乔

而且澄清,表2将新的数据和它将包含从表1中的唯一的事情就是保持外键关系

的ID另外这是SQL Server 2000中

您需要阅读这篇文章。

What are the most common SQL anti-patterns?

的主要问题是,IDS是不是在表中的所有连续的1,所以我们必须从表1看,然后插入基于的发现为表2

的id

是的,看看我在上面的文章中的答案,并使用Item#2编写一个键循环循环。

确保在编写插入语句时,您提供了一个字段列表 - 正如我在项目#1中所述。

我不确定我是否正在关注你,但是会为你工作吗?

INSERT INTO table2 (SELECT field1, field2, field3... FROM table1) 

如果我理解正确,您希望table1中的每条记录都有一条记录。这将做到这一点。只需按照正确的顺序在select中匹配您的字段,然后为table2中的任何字段指定常量,这些字段在table1中不存在。

HTH。让我知道如果我不理解,我会再次尝试帮助。

+0

是否在SQL服务器这句法工作?尝试时,我得到一个错误,说“错误附近选择” – Trevor 2013-07-29 14:19:51

有了这么多行,您可能会遇到事务日志空间和运行大型插入事务的时间长度问题。

如果运行时间是一个约束我会认真地建议使用BCP(或取决于平台什么都工具适用)

选择出的ID从原始表,用它来建立一个BCP文件的扩展表,然后Bcp它。

很多人发现它更高性能的Bcp在10,000记录的文件,而不是一个17000000行的humungus文件。

此外,您可以在上线前在背后做这件事,然后编写一份t-sql作业以便在拿到id的snapshop后插入。

如果我理解正确,您希望table1中的每条记录都有一条记录。 另外我相信除了对table1的引用之外,table2最初应该包含空行。

因此,假设

table1 (ID, field1, field2, ...) 
table2 (ID, table1_ID, fieldA, fieldB,...) 
-- where table1_ID is a reference to ID of table1 

创建表2以后,就可以运行这个插入语句

insert into table2(table1_ID) 
select ID from table1