【问题标题】:Autoincrementing for each primary key in PostgresqlPostgresql中每个主键的自动递增
【发布时间】:2019-06-25 18:29:44
【问题描述】:

我使用 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

【问题讨论】:

  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example 尝试在rextester.com 中创建样本
  • 我不确定你想要什么,请举个例子
  • 再次,给我们看一个例子。但如果你想要我认为你想要的。这不能在表定义中完成。您可能需要一个触发器来更改该计数器。

标签: postgresql


【解决方案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$

【讨论】:

  • 这在多个事务插入数据的系统中是行不通的。 (顺便说一句:不需要中间变量,可以直接使用select coalesce(..) into new.counter from ....
  • @a_horse_with_no_name 我也有同样的想法,但无法设置 sqlFiddle 来测试它。对解决方法有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2018-11-23
  • 2019-08-07
相关资源
最近更新 更多