将主键插入第一个表后,如何使用触发器将主键插入另一个表?

Posted

技术标签:

【中文标题】将主键插入第一个表后,如何使用触发器将主键插入另一个表?【英文标题】:How to insert a primary key into another table with a trigger after inserting it in the first table? 【发布时间】:2021-10-25 10:13:36 【问题描述】:

我的数据库包含两个表;每个表在列ID 上都有主键。

第一个表tbl_Person也有一个外键引用第二个表tbl_Address

tbl_Person           tbl_Address
+----+------+        +----+---------+
| ID | Name |        | ID | Address |
+----+------+        +----+---------+
| 1  | Jim  |  --->  | 1  |  .....  |
| 2  | Tim  |        | 2  |  .....  |
| 3  | Kim  |        | 3  |  .....  |
+----+------+        +----+---------+

我现在想知道如何创建一个触发器,它将新插入的人的ID 插入第二个表tbl_Address,并将tbl_Address 的所有其他属性设置为NULL。

我当前的触发器如下所示:

CREATE TRIGGER tg_Person 
ON tbl_Person
BEFORE INSERT
AS 
BEGIN
   DECLARE @ID INT
 
   SELECT @ID = SCOPE_IDENTITY()
   FROM tbl_Person

   INSERT INTO tbl_Address (ID)
   VALUES (@ID)
END

【问题讨论】:

"第一个表 tbl_Person 也有一个外键引用第二个表 tbl_Address" 你不是说tbl_Address 有一个引用@ 的FOREIGN KEY 987654331@? 是的,我就是这个意思 您是否注意到 Larnu 还修复了您原始代码中的两个严重缺陷?不要假设触发器执行时插入(或更新或删除)单行。 TSQL 也不支持“之前”触发器。但你还是另一个严重的问题。您正在向 tbl_address 中插入没有实际信息的“假”行。 【参考方案1】:

你需要引用inserted伪对象:

CREATE TRIGGER trg_CreatePersonAddress ON dbo.Tbl_Person
AFTER INSERT AS
BEGIN

    INSERT INTO dbo.tbl_Address(ID) --Should this not be PersonID?
    SELECT ID
    FROM inserted;

END;
GO

【讨论】:

应该检查一个空的插入表并且什么都不做。

以上是关于将主键插入第一个表后,如何使用触发器将主键插入另一个表?的主要内容,如果未能解决你的问题,请参考以下文章

EF6 vs Entity Framework Core:插入实体而不将主键(身份)重置为零

Mybatis实现插入数据的时候将主键赋值给对象的两种方法

mysql创建数据库时怎么将主键设置为UUID,建表语句怎么写

如何将主键和外键添加到 BigQuery?

插入时将PK添加到另一列

将主键更改为自动递增