Postgresql中每个主键的自动递增

时间:2019-06-25 18:29:44

标签: postgresql

我使用SERIAL语句在Postgres中自动增加了一行。到目前为止,该工作还不错,但我想为每个主键自动递增。我该如何解决?

CREATE table snapshot(tracking_number varchar(20), 
                      counter SERIAL, 
                      date date, 
                      time time, 
                      status varchar(100), 
                      PRIMARY KEY(tracking_number, counter));

例如,对于每个新条目,计数器都会递增,但是我希望每个主键的条目都以1开头,并且仅当再次插入相同的主键时才递增。

insert into snapshot(tracking_number, date, time, status) values (‘123’, ‘2018-05-05’,’09:00’, ‘mystatus’);

insert into snapshot(tracking_number, date, time, status) values (‘999’,‘2018-05-05’,’09:00’, ‘mystatus’);

这两个插入应导致两个条目的计数器为1

insert into snapshot(tracking_number, date, time, status) values (‘999’,‘2018-05-05’,’09:00’, ‘mystatus’);

再次插入'999'会产生一个'999'的计数器为2,'123'的计数器仍为1

1 个答案:

答案 0 :(得分:1)

您不能通过串行方式执行此操作。所以我建议您使用触发器。

触发:

CREATE TRIGGER my_trigger
BEFORE INSERT ON snapshot
FOR EACH ROW
EXECUTE PROCEDURE snapshot_insert()

触发功能:

CREATE OR REPLACE FUNCTION snapshot_insert()
  RETURNS trigger AS
$BODY$
BEGIN
   _counter bigint := (SELECT COALESCE(max(counter), 0) + 1
                       FROM   snapshot
                       WHERE  tracking_number = NEW.tracking_number);

   NEW.counter := _counter;

   RETURN NEW;
END;
$BODY$