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

Posted

技术标签:

【中文标题】使用触发器将值插入另一个表,除非值存在,在这种情况下更新【英文标题】:Using a trigger to insert values into another table unless value exists in which case update 【发布时间】:2019-12-18 15:34:03 【问题描述】:

我有一个表 (Table1),它包含三列:“ID”、“状态”、“标题”。我有第二个表(Table2),它有三列:'ID'、'Table1ID'、'Title'。

ID 是一个连续的数字值,title 是一个字母数字值,status 的值是 0 或 1。在 Table1 中创建记录时,从值 0 开始。

我想要实现的是一个触发器:当 [Table1].Status 从值 0 更改为 1 时,将具有 [Table1].ID 值的新行插入 [Table2] 到 [Table2] .Table1ID 和[Table1].Title 变成[Table2].Title 只在[Table1] 中更新记录。

但是,如果 [Table2].Table1ID 在更新后的值上已经有 [Table1].ID 的匹配值,那么它应该简单地更新 [Table2].Title 的值,而不是插入新行。

到目前为止,这是我尝试过的:

Create Trigger [dbo].[test]
ON [dbo].[Table1]
After Update
As Begin
Set NOCOUNT ON;
IF UPDATE (Status)
Begin
INSERT INTO [Table2]
VALUES ((SELECT DISTINCT ID FROM INSERTED WHERE NOT EXISTS (SELECT * FROM TABLE2 WHERE TABLE2.TABLE1ID = INSERTED.ID)))

END
END
Go

【问题讨论】:

我认为你有一个不错的开始,但这里有一些问题。首先是 UPDATE 功能。如果状态列在更新语句中,那将返回 true。它不评估值是否发生了变化。其次,您有一个带有 select 语句的插入。这很好,但是您将它包含在值子句中。如果您的更新影响了超过 1 行,则此触发器将失败。 注意 - 您的代码表明 ID 在 Table1 中不是唯一的(否则 - 为什么需要 DISTINCT),而它在 Table2 中是唯一的。列名表明 ID 在 Table1 中是唯一的。这就是为什么最好发布包含所有实际约束的 DDL。任何建议都可能猜对——但也可能猜错。 【参考方案1】:

如果我了解所有要求,我认为您需要这样的东西。首先,它只会在状态发生变化时更新 Table2。由于您正在更新 Title,我认为您会在 Title 的值发生变化时更新它,但这不是您所说的您想要的。

然后它将插入任何不存在的行。

请注意,无论行如何在单个更新语句中更新,这都会起作用。

Create Trigger [dbo].[test]
ON [dbo].[Table1]
After Update
As Begin
    Set NOCOUNT ON;

    --first we need to update any existing rows in Table2
    update t2
    set Title = i.Title
    from inserted i
    join deleted d on d.ID = i.ID 
    join Table2 t2 on t2.ID = i.ID
    where d.Status = 0 --only where the row in Table1 has a status of 0
        and i.Status = 1 --only when the new value has status = 1

    --now we can insert any rows that don't already exist into Table2
    INSERT INTO [Table2]
    (
        ID
        , Title
    )
    SELECT i.ID
        , i.Title 
    FROM INSERTED i
    WHERE NOT EXISTS 
    (
        SELECT * 
        FROM TABLE2 
        WHERE TABLE2.TABLE1ID = i.ID
    )

END

【讨论】:

太好了——这完全符合我的预期。非常感谢!

以上是关于使用触发器将值插入另一个表,除非值存在,在这种情况下更新的主要内容,如果未能解决你的问题,请参考以下文章

如何将值插入表中并使用一个按钮更新另一个表中的值?

Mysql - 将值插入具有未知主键的多个表中

我可以通过查询将值传递给SQL触发器吗?

如果值不存在,将值插入 MySQL 表?

POSTGRES:如何仅在另一个值不存在时选择具有某个值的行,在这种情况下选择另一个值?

使用雪花中的存储过程将值插入表中