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
列的原因之一。
我有以下两个 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
列的原因之一。