【问题标题】:How to update multiple rows with the same sequence value如何更新具有相同序列值的多行
【发布时间】:2023-03-16 15:53:01
【问题描述】:

我正在使用 DB2,并且想用序列中的下一个值更新满足我条件的几行。 这是我尝试过的,但这不起作用,因为为每一行获取下一个值:-

update dependency dep set vid=NEXT VALUE FOR seq_VID where id in ('8371','8372','8373')

id 是主键,seq_VID 是一个序列。所以我希望说下一个序列值是 99,所有 3 行都设置为 99(而不是像这种情况那样设置为 99,100,101)。 我的解决方法是将其分解为列表中每个 id 的单独语句,即

update dependency dep set vid=NEXT VALUE FOR seq_VID where id= ('8371')
update dependency dep set vid=PREVIOUS VALUE FOR seq_VID where id= ('8372')
update dependency dep set vid=PREVIOUS VALUE FOR seq_VID where id= ('8373')

但如果可能的话,我想在一条 SQL 语句中执行它 - 有什么想法吗?

【问题讨论】:

    标签: sql db2 sql-update sequence


    【解决方案1】:

    如果您一直都知道要将“上一个”序列值放在使用“下一个”下一个值更新的行之后的两行中,那么您可能可以使用复合触发器,类似于以下内容(Oracle语法,请见谅):

    CREATE OR REPLACE TRIGGER DEPENDENCY_COMPOUND
      FOR UPDATE ON DEPENDENCY
      COMPOUND TRIGGER
    
      TYPE tDependency_row_table IS TABLE OF DEPENDENCY%ROWTYPE;
      tblDependency_rows  tDependency_row_table := tDependency_row_table();
    
      AFTER EACH ROW IS
      BEGIN
        tblDependency_rows.EXTEND;
        tblDependency_rows(tblDependency_rows.LAST).ID = NEW.ID+1;
        tblDependency_rows(tblDependency_rows.LAST).VID = seq_VID.CURRVAL;
    
        tblDependency_rows.EXTEND;
        tblDependency_rows(tblDependency_rows.LAST).ID = NEW.ID+2;
        tblDependency_rows(tblDependency_rows.LAST).VID = seq_VID.CURRVAL;
      END;
    
      AFTER STATEMENT IS
      BEGIN
        FOR i IN tblDependency_rows.FIRST..tblDependency_rows.LAST LOOP
          UPDATE DEPENDENCY
            SET VID = tblDependency_rows(i).VID
            WHERE ID = tblDependency_rows(i).ID;
        END LOOP;
      END;
    END DEPENDENCY_AU;
    

    然后你会发布你的更新声明

    UPDATE DEPENDENCY
      SET VID = seq_VID.NEXTVAL
      WHERE ID = 8371;
    

    并且触发器应该负责更新其他两行。

    复合触发器在 Oracle 11+ 中非常有用,可帮助解决“变异表”错误,当触发器尝试在触发器所在的同一个表中选择、插入、更新或删除数据时会发生这种错误。

    这是一个相当人为的情况,并且对应该更新哪些行做出了一些巨大的假设,但也许它会被证明是有用的。

    分享和享受。

    【讨论】:

    • 感谢您的见解,但是在我上面的示例中,列表中有 3 个 id,但是当我将此查询作为更大查询的一部分运行时,这会从 1 到多个不等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多