正如 Joel 所提到的,约束值不会自动从一个表插入到另一个表。如果 Table2 中的外键是 Table1 中的主键值,那么在向@Table2 插入新行之前,您需要捕获@Table1 的主键值。
这是执行此操作的常用方法。您可以在 SSMS 中运行此示例。
/* Create a mock-up of Table1 and Table2 */
DECLARE @Table1 TABLE (
Table1_Value VARCHAR(50), pk_Table1 INT IDENTITY (1,1) NOT NULL PRIMARY KEY
);
DECLARE @Table2 TABLE (
fk_Table1 INT, Table2_Value VARCHAR(50), pk_Table2 INT IDENTITY (999,1) NOT NULL PRIMARY KEY
);
声明一个表变量 (@out) 以在插入行时捕获 Table1 的主键值:
/* Declare an OUTPUT table to capture the PK of the value inserted into @Table1 */
DECLARE @out TABLE ( pk_Table1 INT );
一旦我们有了这些东西,我们就可以在 Table1 中插入一个新行并捕获它的主键值。
/* Insert a value into @Table1 and capture its PK */
INSERT INTO @Table1 ( Table1_Value )
OUTPUT inserted.pk_Table1 INTO @out
VALUES
( 'Table1_Value01' );
值得注意的是这个人:
OUTPUT inserted.pk_Table1 INTO @out
这允许我们捕获插入到 Table1 中的任何值,但在这种情况下,我们关心的是 pk_Table1。
如果我们查看@out的结果集:
/* Show the results captured in @out */
SELECT * FROM @out;
我们看到以下内容:
+-----------+
| pk_Table1 |
+-----------+
| 1 |
+-----------+
查看@Table1的结果集:
/* Show the @Table1 resultset */
SELECT * FROM @Table1 ORDER BY pk_Table1;
返回:
+----------------+-----------+
| Table1_Value | pk_Table1 |
+----------------+-----------+
| Table1_Value01 | 1 |
+----------------+-----------+
现在我们已经捕获了 Table1 新行的主键,我们可以将一个新行插入到 @Table2 中,其值将其与 @Table1 联系起来。
/* Insert a new value into @Table2 with a foreign key value pointing to @Table1 */
INSERT INTO @Table2 ( fk_Table1, Table2_Value )
VALUES ( ( SELECT pk_Table1 FROM @out ), 'Table2 value related to Table1 value.' );
这家伙……
( SELECT pk_Table1 FROM @out )
返回我们在将行插入@Table1 时捕获的主键值。
如果我们查看@Table2的结果集:
/* Show the @Table2 resultset */
SELECT * FROM @Table2 ORDER BY pk_Table2;
我们看到了:
+-----------+---------------------------------------+-----------+
| fk_Table1 | Table2_Value | pk_Table2 |
+-----------+---------------------------------------+-----------+
| 1 | Table2 value related to Table1 value. | 999 |
+-----------+---------------------------------------+-----------+
最后,我们可以根据它们的关系将两个表连接在一起:
/* Join the two tables based on their relationship */
SELECT
t1.pk_Table1,
t1.Table1_Value,
t2.fk_Table1,
t2.pk_Table2,
t2.Table2_Value
FROM @Table1 AS t1
INNER JOIN @Table2 AS t2
ON t1.pk_Table1 = t2.fk_Table1
ORDER BY
t1.pk_Table1;
返回:
+-----------+----------------+-----------+-----------+---------------------------------------+
| pk_Table1 | Table1_Value | fk_Table1 | pk_Table2 | Table2_Value |
+-----------+----------------+-----------+-----------+---------------------------------------+
| 1 | Table1_Value01 | 1 | 999 | Table2 value related to Table1 value. |
+-----------+----------------+-----------+-----------+---------------------------------------+
显然,这不是深入探讨基于唯一值关联两个表,但是,它很容易理解。
这是您可以在 SSMS 中运行的完整示例:
/* Create a mock-up of Table1 and Table2 */
DECLARE @Table1 TABLE (
Table1_Value VARCHAR(50), pk_Table1 INT IDENTITY (1,1) NOT NULL PRIMARY KEY
);
DECLARE @Table2 TABLE (
fk_Table1 INT, Table2_Value VARCHAR(50), pk_Table2 INT IDENTITY (999,1) NOT NULL PRIMARY KEY
);
/* Declare an OUTPUT table to capture the PK of the value inserted into @Table1 */
DECLARE @out TABLE ( pk_Table1 INT );
/* Insert a value into @Table1 and capture its PK */
INSERT INTO @Table1 ( Table1_Value )
OUTPUT inserted.pk_Table1 INTO @out
VALUES
( 'Table1_Value01' );
/* Show the results captured in @out */
SELECT * FROM @out;
/* Show the @Table1 resultset */
SELECT * FROM @Table1 ORDER BY pk_Table1;
/* Insert a new value into @Table2 with a foreign key value pointing to @Table1 */
INSERT INTO @Table2 ( fk_Table1, Table2_Value )
VALUES ( ( SELECT pk_Table1 FROM @out ), 'Table2 value related to Table1 value.' );
/* Show the @Table2 resultset */
SELECT * FROM @Table2 ORDER BY pk_Table2;
/* Join the two tables based on their relationship */
SELECT
t1.pk_Table1,
t1.Table1_Value,
t2.fk_Table1,
t2.pk_Table2,
t2.Table2_Value
FROM @Table1 AS t1
INNER JOIN @Table2 AS t2
ON t1.pk_Table1 = t2.fk_Table1
ORDER BY
t1.pk_Table1;