如何使用相同的序列值更新多行

发布于 2024-09-13 11:04:54 字数 599 浏览 4 评论 0原文

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

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

id 是主键,seq_VID 是序列。所以我所希望的是,下一个序列值是 99,那么 99 将为所有 3 行设置(而不是像这样的 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 语句中执行它 - 有什么想法吗?

I'm using DB2 and want to update several rows that meet my condition with the same next value from my sequence.
Here is what I tried but this doesn't work as the next value is fetched for each row:-

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

id is the the primary key and seq_VID is a sequence. So what I had hoped was that say the next sequence value was 99, that 99 would be set for all 3 rows (and not 99,100,101 as is the case with this).
My workaround is to break it into separate statements for each id in my list, i.e.

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')

But I'd like to execute this in one SQL statement if possible - any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑凤梨 2024-09-20 11:04:54

如果您始终知道想要将“前一个”序列值放在使用“下一个”下一个值更新的行之后的两行上,则可以使用复合触发器,类似于以下内容(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+ 中非常有用,可帮助解决“变异表”错误,当触发器尝试在触发器所在的同一个表中 SELECT、INSERT、UPDATE 或 DELETE 数据时会发生该错误。

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

分享并享受。

If you always knew that you wanted to put the 'previous' sequence value on the two rows after the one you updated with the 'next' next value you might be able to use a compound trigger, similar to the following (Oracle syntax, please forgive):

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;

Then you'd issue your update statement as

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

and the trigger should take care of updating the other two rows.

The compound trigger is useful in Oracle 11+ to help work around the 'mutating table' error, which occurs when a trigger attempts to SELECT, INSERT, UPDATE, or DELETE data in the same table which the trigger is on.

This is a rather contrived situation and makes some huge assumptions about which rows should be updated, but perhaps it will prove useful.

Share and enjoy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文