我有两个表,第一个表的主键是一个身份,第二个表的主键不是,但是该键有一个外键约束回到第一个表的主键。
如果我一次插入一条记录,我可以使用 Scope_Identity 来获取刚刚插入到表 1 中的 pk 值,我想插入到第二个表中。
我的问题是我有很多来自我想在两个表中插入的选择的记录,我无法想到一种基于集合的方式来进行这些插入。
我目前的解决方案是使用游标,插入第一个表,使用 scope_identity 获取键,插入第二个表,重复。
我错过了非光标解决方案吗?
我有两个表,第一个表的主键是一个身份,第二个表的主键不是,但是该键有一个外键约束回到第一个表的主键。
如果我一次插入一条记录,我可以使用 Scope_Identity 来获取刚刚插入到表 1 中的 pk 值,我想插入到第二个表中。
我的问题是我有很多来自我想在两个表中插入的选择的记录,我无法想到一种基于集合的方式来进行这些插入。
我目前的解决方案是使用游标,插入第一个表,使用 scope_identity 获取键,插入第二个表,重复。
我错过了非光标解决方案吗?
是的,在在线图书中查找输出子句。
本周我遇到了这个问题:有人在使用自然键的模式中引入了一个带有无意义代理键的表。毫无疑问我会很快解决这个问题:) 在那之前,我正在通过创建一个数据表来解决它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;