PostgreSQL 触发器中的唯一约束冲突

Unique constraint violation in PostgreSQL Trigger

我有以下两个 table。我在 insert trigger on employees table 之后写道。如果我在 employees table 中插入记录,它将在 employee_audits table.

中插入记录

两者 table 都有主键列 (id)。假设如果您尝试插入在 employees table 中不存在而在 employee_audits table 中存在的记录 ID 值,它显示 错误重复键值违反了唯一约束 "employee_audits_pkey" 并且它没有在员工 table 中插入记录。两次交易均失败。 但是我想在 employees table.

中插入记录
CREATE TABLE employees(
   id SERIAL PRIMARY KEY,
   first_name VARCHAR(40) NOT NULL,
   last_name VARCHAR(40) NOT NULL
);

CREATE TABLE employee_audits (
   id SERIAL PRIMARY KEY,
   last_name VARCHAR(40) NOT NULL,
   changed_on TIMESTAMP(6) NOT NULL
)

触发函数:

CREATE OR REPLACE FUNCTION log_last_name_changes()
  RETURNS trigger AS
$BODY$
BEGIN
   INSERT INTO employee_audits(last_name,changed_on)
   VALUES(NEW.last_name,now());
   RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE

触发器定义:

CREATE TRIGGER last_name_changes
  AFTER INSERT
  ON employees
  FOR EACH ROW
  EXECUTE PROCEDURE log_last_name_changes();
INSERT INTO employees (first_name, last_name)
VALUES ('John', 'Doe');

SELECT * FROM EMPLOYEES
id first_name   last_name
1  "John"        "Doe"
SELECT * FROM EMPLOYEE_AUDITS
ID   last_name  CHANGED_ON
1      "Doe"    "2019-12-27 17:21:13.934"

第二个手动插入 table

insert into employee_audits values(2,'banu','2019-12-27 17:21:13.934')

第一次手动插入 table

INSERT INTO employees (first_name, last_name)
VALUES ('David', 'Raj');

Error duplicate key value violates unique constraint "employee_audits_pkey"

是否可以在员工中插入记录table?

如果您有一个 serial 列,您永远不应手动为其提供值。手动为 serial 提供值将 不会 推进该列后面的序列,因此下次您在不指定 id 列的情况下插入时,下一个序列值将采用 2 因为序列只前进了一次。

所以代替:

insert into employee_audits values(2,'banu','2019-12-27 17:21:13.934')

只需使用:

insert into employee_audits (last_name, changed_at)
values ('banu','2019-12-27 17:21:13.934');

serial 列的这种行为是 highly recommended 在现代 Postgres 版本中使用 identity 列的原因之一。