本週我有這個問題:有人已經將一個無意義的代理鍵引入到使用自然鍵的模式中。毫無疑問,我會很快解決這個問題:)直到那時,我正在通過創建一個到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;
這看起來很有希望,但是一個問題/問題。似乎需要輸出子句提供的足夠信息才能將輸出行唯一地匹配回輸入select中的正確行,以便我可以使用scope_identity值。這可能並不總是可用的。 – automatic 2009-06-18 13:44:58