将基于插入的插入设置为具有1到0-1关系的两个表

时间:2009-06-18 12:50:29

标签: sql sql-server-2008 insert identity

我有两个表,第一个有一个主键是一个标识,第二个有一个主键不是,但是该键有一个外键约束回到第一个表的主键。

如果我一次插入一条记录,我可以使用Scope_Identity来获取刚插入到表1中的pk的值,我想插入到第二个表中。

我的问题是我有很多记录来自我想在两个表中插入的选项,我无法想到基于集合的方法来执行这些插入。

我目前的解决方案是使用游标,插入第一个表,使用scope_identity获取密钥,插入第二个表,重复。

我错过了非光标解决方案吗?

2 个答案:

答案 0 :(得分:2)

是的,在线查阅图书中的输出条款。

答案 1 :(得分:0)

本周我遇到了这个问题:有人将一个带有无意义代理键的表引入到使用自然键的模式中。毫无疑问我会很快解决这个问题:)直到那时,我正在通过创建一个数据表来解决它:INSERT来自:{}可以是永久或临时基表或派生表(见下文) ,无论如何,这应该适合您对基于集合的解决方案的需求。使用此表与表之间的连接以及自然键上的IDENTITY列来查找自动生成的值。这是一个简短的例子:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;