Postgresql -如何创建一个带有整数值的version列?

plicqrtu  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(2)|浏览(110)

如何在表中创建一个列,该列包含一个整数值(插入一行时从0开始),每次更新一行时,该整数值将递增1?
我需要它来使用它作为乐观锁定。
谢谢。

irtuqstp

irtuqstp1#

你需要使用一个触发器来实现这一点。没有自动或内置的解决方案

create table some_table
(
   id serial primary key, 
   some_data text, 
   version integer not null default 0
);

create or replace function increment_version()
  returns trigger
as
$body$
begin
  new.version := new.version + 1;
  return new;
end;
$body$
language plpgsql;

create trigger version_trigger
   before update on some_table
   for each row execute procedure increment_version();

注意,触发器函数可用于包含名为version(数字)的列的 * 任何 * 表。

7lrncoxx

7lrncoxx2#

您可以在单个update语句中完成此操作。您的insert语句可以将其保存为0,而update语句可以在每次更新该行时将其增加1

create table orders
(
    id varchar(255) not null constraint orders_pkey primary key,
    name         varchar(255) UNIQUE,
    order_status varchar(30),
    version integer NOT NULL DEFAULT 0,
    create_time  timestamp,
    update_time  timestamp
);

-- Always save the version as 0 for inserts
INSERT INTO orders
VALUES (:id, :name, :order_status, :version, :create_time, :update_time);

-- Increase version in each update and check the version
UPDATE TABLE
SET name = :name,
    order_status = :order_status,
    update_time = :update_time,
    version = version + 1
where id = :id
  and version = :version;

要实现乐观锁定,在update语句运行后,您需要检查任何更新的记录,如果没有,则您知道在更新之前提交了另一个更新请求,您需要重试更新。

相关问题