PostgreSQL触发器中违反唯一约束的条件>>

问题描述 投票:2回答:1

我有下面两个表。我在雇员表上插入触发器后写了。如果我在employees表中插入记录,它将在employee_audits表中插入记录。

两个表都具有主键列(id)。假设您尝试插入在employees表中不存在但在employee_audits表中存在的记录ID值,则显示错误重复键值违反唯一约束“ employee_audits_pkey”,并且它没有在employees表中插入记录。两次交易均失败。但是我想在雇员表中插入记录。

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"

手动插入第二张桌子

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

手动插入第一张桌子

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

错误的重复键值违反了唯一约束“ employee_audits_pkey”

是否可以在雇员表中插入记录?

我有下面两个表。我在雇员表上插入触发器后写了。如果我在employees表中插入记录,它将在employee_audits表中插入记录。两个表都有主键...

postgresql-9.1 database-trigger unique-constraint
1个回答
1
投票

如果有serial列,则永远不要手动为其提供值。手动为serial提供值将使该序列后面的[[not

© www.soinside.com 2019 - 2024. All rights reserved.