簡體   English   中英

SQLite更新觸發器更改表中的所有行

[英]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.idid進行過濾,在其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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM