![](/img/trans.png)
[英]Sqlite Trigger to Update table 1 when certain rows of table 2 is updated
[英]SQLite update trigger changes all rows in the table
問題:最簡單的更新觸發器會將新值寫入所有表行,而不僅僅是正在更新的行。 這是表格:
[名]
id INTEGER PRIMARY KEY
name TEXT
len INTEGER
現在我想創建觸發器以'name'的長度更新'len'。 這個INSERT觸發器似乎正在做核心工作:
CREATE TRIGGER 'namelen' AFTER INSERT ON 'names'
BEGIN
UPDATE 'names' SET len = length(NEW.name) WHERE (id=NEW.id);
END;
添加類似的UPDATE觸發器時出現問題:
CREATE TRIGGER 'namelenupd' AFTER UPDATE ON 'names'
BEGIN
UPDATE 'names' SET len = length(NEW.name) WHERE (OLD.id=NEW.id);
END;
盡管有WHERE子句,update觸發器會將新長度寫入表的所有行 。 例如,如果我說
UPDATE 'names' SET name='foo' where id=1;
然后'len'的值對於表的所有行變為3。 我看過sqlite觸發器示例,我看不到我的錯誤。 還有什么辦法可以確保觸發器僅在實際更新的行中更新'len'列?
OLD.xxx和NEW.xxx都引用導致觸發器運行的表行。 觸發器內的UPDATE語句獨立運行; 如果要將其限制為一個表行,則必須通過對該語句的表值(即names.id
或id
進行過濾,在其WHERE子句中顯式執行此操作。
當原始UPDATE語句不更改id
列時,舊id
和新id
值相同,表達式OLD.id=NEW.id
對於表中的所有記錄都為true,如內部UPDATE語句所示。
正確的觸發器如下所示:
CREATE TRIGGER "namelenupd"
AFTER UPDATE OF name ON "names"
BEGIN
UPDATE "names" SET len = length(NEW.name) WHERE id = NEW.id;
END;
有同樣的問題,這是我的觸發器的語法
您可以將“ALTER”更改為“CREATE”,具體取決於您已經擁有(或不擁有)
您有"id"
作為主鍵
你的dbo是"names"
顯然,這會將名稱值設置為“foo”(不是你想要的)。 鍵似乎是最后一行,您在其中設置inner join inserted on names.Id = inserted.Id
。
USE [yourDBname]
ALTER TRIGGER [dbo].[yourTrigger]
ON [dbo].[names]
After INSERT, UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Select id from inserted
begin
update [dbo].names
set [dbo].names.name = 'foo'
from dbo.names
inner join inserted
on names.id = inserted.id
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.