自动增量:SQL Server



我有一个以auto_incrementID列为主键的表(Table1(,它运行良好。我还有另一个表(Table2(,它有一个使用Table1中ID列的外键。

现在,当我查看表2中的记录时,我在ID列中看到NULL,并且我没有得到自动生成的数字。我也用Identity(1,1)进行了尝试,得到了相同的结果。

我该怎么解决这个问题?

作为后续操作,假设我向现有表添加了一个新列,并希望为其提供1到20的值。我该怎么做?

正如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;

相关内容

  • 没有找到相关文章

最新更新