在插入触发器上从 table1 插入到 table2

Posted

技术标签:

【中文标题】在插入触发器上从 table1 插入到 table2【英文标题】:Insert from table1 to table2 on insert trigger 【发布时间】:2010-07-30 16:19:34 【问题描述】:

我对 SQL 很陌生,所以请原谅我的无能。

我正在尝试编写一个触发器,在插入表 1 时,将该记录插入表 2。

表1是[rps_lab_dev].[dbo].[Lab_Employee_Time_Off]

表2是[dbo].[Lab_Employee_Time_Off_Detail]

CREATE TRIGGER updatetrig
ON [rps_lab_dev].[dbo].[Lab_Employee_Time_Off]

FOR INSERT

AS
...

我不确定从这里去哪里(如果这甚至是正确的,我现在没有要检查的 sql)。任何方向都将不胜感激。

【问题讨论】:

您使用的是什么关系型数据库?触发器语法因 Oracle、mysql 等而异。 嗨,欢迎来到 Stack Overflow。这是哪个数据库引擎? 我希望我知道如何像这个板上的许多其他人一样“闻”到 T-SQL / SQL Server 查询...... @sheepsimulator:方括号、dbo 和触发器 - 如果只有方括号,可能是 MS Access。 TSQL 可能是 Sybase,但这样的问题很少见…… 【参考方案1】:

当您处于 INSERT 触发器中时,您会得到一组称为 INSERTED 的记录。您可以使用它来执行您想要的任何操作。

如果您处于 UPDATE 触发器中,那么您将获得两组数据 DELETED 和 INSERTED - 从逻辑上讲,其中 DELETED 是将被新 INSERTED 数据覆盖的旧数据。

在你的情况下,让我们在这里做几件事。首先,它是一个 INSERT 触发器,所以我们称之为它。然后让我们从 INSERTED 中获取数据(它将与您的传入数据具有相同的列名)并使用它插入到您的详细信息表中

CREATE TRIGGER Lab_Employee_Time_Off_InsertAction
ON [rps_lab_dev].[dbo].[Lab_Employee_Time_Off]

FOR INSERT

AS


INSERT INTO [dbo].[Lab_Employee_Time_Off_Detail] (Col01, Col02, Col03)
SELECT Col1, Col2, Col3
FROM Inserted

GO

http://msdn.microsoft.com/en-us/library/ms189799.aspx

【讨论】:

另一件值得一提的重要事情是,SQL Server 中的触发器每次插入操作一次,如果您插入一组记录,则必须能够处理。这段代码可以做到这一点,但我希望提出问题的人理解为什么要使用基于集合的逻辑,而不是尝试将事物设置为变量并使用 values 子句。此外,始终通过执行多行插入更新或删除来测试触发器。【参考方案2】:

对于 SQL Server...

CREATE TRIGGER updatetrig 
ON [rps_lab_dev].[dbo].[Lab_Employee_Time_Off] 

FOR INSERT 

AS 

INSERT INTO [dbo].[Lab_Employee_Time_Off_Detail] (Column1, Column2, Column3)
SELECT Column1, Column2, Column3 FROM inserted

只需将 Column1、Column2 和 Column3 替换为您的列名即可。

【讨论】:

以上是关于在插入触发器上从 table1 插入到 table2的主要内容,如果未能解决你的问题,请参考以下文章

数据库触发器:插入时

插入或删除后的 Oracle 触发器

创建一个触发器,在更新行时将旧值插入其他表

sqlserver,触发器做备份表如何插入当前时间?

使用触发器将值插入另一个表,除非值存在,在这种情况下更新

MySQL插入查询如果条件匹配在插入触发器之后