每次将记录插入主表中时强制将记录插入到辅助表中

时间:2020-10-14 18:17:48

标签: sql sql-server tsql parent-child sql-insert

在SQL Server 2008 R2的安装程序中,我有table1 (id, col1-1, col1-2, ...)table2 (id, table1_id, col2-1, col2-2, ...),其中table2.table1_id指向table1.id(即外键与主键的关系)。 / p>

我该如何执行以下规则:每次有人将记录插入table1时,他们还需要在table2中创建记录?

我猜想这里使用的明显机制是触发器,但这会导致鸡和蛋的问题,因为触发器需要table2中的记录才能在{{1 }},但是为了在table1中创建记录,我需要table2值已经存在。如何克服这个问题?

我需要自动实施实施并将其内置到数据库中。频繁运行的作业要检查table1.id中的记录而没有table1中的相应记录将无法进行剪切,并且当某人实际上在table2中创建记录时,必须实时执行该规则。

2 个答案:

答案 0 :(得分:0)

您只需使用OUTPUT子句即可。这是一个简单的例子

CREATE TABLE Parent(Id INT, Col VARCHAR(45));
CREATE TABLE Child(Id INT, Col VARCHAR(45));

INSERT INTO Parent(Id, Col)
OUTPUT INSERTED.Id, INSERTED.Col INTO Child
VALUES(1, 'SomeValue');
  
SELECT *
FROM Parent P
JOIN Child C ON P.Id = C.Id;

请注意,对SQL Server 2008/2008 R2的扩展支持将于2019年7月9日结束。您应尽快升级。

答案 1 :(得分:0)

鸡肉和鸡蛋问题是可以预防的,但是我在Windows SQL 2016上进行了测试:

    CREATE TRIGGER [dbo].[Table1_Insert]
       ON [dbo].[Table1RR] AFTER INSERT
    AS
    IF rowcount_big() = 0 RETURN --leave trigger if no record (-s) inserted in the Table1
    SET NOCOUNT ON
    ALTER TABLE dbo.Table2RR NOCHECK CONSTRAINT FK_Table2_Table1 -- resolve chicken and the egg problem 
    INSERT INTO dbo.Table2RR select id,null,null from inserted order by id
    ALTER TABLE dbo.Table2RR CHECK CONSTRAINT FK_Table2_Table1
    GO
    ALTER TABLE [dbo].[Table1RR] ENABLE TRIGGER [Table1_Insert]
    GO