gpt4 book ai didi

SQL触发器更新另一个表

转载 作者:行者123 更新时间:2023-12-04 22:16:27 26 4
gpt4 key购买 nike

我有一个 Maximo 数据库,它有一个我无法更改的表结构。我希望在创建或更新时将主要电子邮件地址复制到 PERSON 表中。以下结构描述了PERSON表和EMAIL表


人员表:

PERSONID | EMAIL | ...(other irrelevant columns)...

EMAIL 表:

PERSONID | EMAILADDRESS | ISPRIMARY | ...(other irrelevant columns)...

如您所见,这两个表在 PERSONID 列上链接。这是我希望触发器执行的操作:
如果更新了 EMAIL 表或插入了新行,我想将 EMAILADDRESS 字段复制到 PERSON 表上的相应条目(由 PERSONID 链接),如果 ISPRIMARY 字段等于 1(1 表示主要,0 表示二级)。
我没有写很多触发器,所以我想确保我只查看正在更新或插入到 EMAIL 表中的行,并且只有在有新的/更新的主电子邮件地址时才更新 PERSON 表。在此先感谢您的所有帮助!


更新 1:
在查看 Cade 的回复后,这是我开始形成的触发器:

CREATE TRIGGER EMAIL_update ON UPDATE,INSERT  AS  BEGIN      
UPDATE p
SET p.email = i.emailaddress
FROM dbo.PERSON as p
INNER JOIN inserted AS i ON i.PERSONID = p.PERSONID AND i.isprimary=1
END

我相信触发器应该在更新或插入电子邮件表的任何时候工作。

最佳答案

问题将与 EMAIL 表中缺少主键有关。触发器最适合不可变的主键。

此外,如果某行更改为非主要行,您是否会从 PERSON 中删除该条目?

所以在问题域中似乎仍然存在一些悬而未决的问题,但这里是触发器的外观。您可以添加一些东西来查找实际发生更改的行 - 但要小心 NULL。

CREATE TRIGGER EMAIL_update ON UPDATE
AS
BEGIN
UPDATE PERSON
SET EMAIL = i.EMAILADDRESS
FROM PERSON
INNER JOIN inserted AS i
ON i.PERSONID = PERSON.PERSONID
INNER JOIN deleted AS d -- could try changing this to a left join and use same trigger for INSERT
ON -- what? could use PERSONID, but it's not unique
WHERE i.ISPRIMARY = 1 -- This helps with uniqueness, but what about things leaving primary?
-- AND i.EMAILADDRESS <> PERSON.EMAIL -- Could add this (what about NULLs?)
END

关于SQL触发器更新另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com