我使用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
答案 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$