将主键插入第一个表后,如何使用触发器将主键插入另一个表?
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:插入实体而不将主键(身份)重置为零