SQLite update trigger changes all rows in the table

后端 未结 2 1742
太阳男子
太阳男子 2021-01-12 09:12

Problem: a simplest possible update trigger writes a new value to all table rows instead of just the row being updated. Here is the table:

[names]

相关标签:
2条回答
  • 2021-01-12 09:47

    Both OLD.xxx and NEW.xxx refer to the table row that caused the trigger to run. The UPDATE statement inside the trigger runs independently; if you want to restrict it to one table row, you have to explicitly do this in its WHERE clause by filtering on that statement's table values, i.e., names.id or just id.

    When the original UPDATE statement does not change the id column, the old and new id values are the same, and the expression OLD.id=NEW.id is true for all records in the table, as seen by the inner UPDATE statement.

    The correct trigger looks like this:

    CREATE TRIGGER "namelenupd"
    AFTER UPDATE OF name ON "names"
    BEGIN
        UPDATE "names" SET len = length(NEW.name) WHERE id = NEW.id;
    END;
    
    0 讨论(0)
  • 2021-01-12 10:13

    Had the same issue, here's the syntax from my trigger

    You would change "ALTER" to "CREATE" depending on what you already have (or not)

    You have "id" as your primary key

    Your dbo is "names"

    Obviously, this will set the name value to "foo" (not really what you wanted). The key seems to be the last line, where you set 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
    
    0 讨论(0)
提交回复
热议问题