如何在postgresql中插入触发器的自动增量值?
这是来自- 现在我想在如何在postgresql中插入触发器的自动增量值?,sql,postgresql,triggers,Sql,Postgresql,Triggers,这是来自- 现在我想在emp\u audit表中再添加一列,它是主键,比如emp\u audit\u id- 那么现在在上面的SELECT查询中应该出现什么,以便它也可以处理主键emp\u audit\u id。因为您不想在INSERT语句中写出字段列表(其他读者:请参阅下面的注释),您需要使用常规的整数作为主键和手动创建的序列 首先更改emp\u审计表定义: ALTER TABLE emp_audit ADD COLUMN emp_audit_id integer PRIMARY KEY 创
emp\u audit
表中再添加一列,它是主键,比如emp\u audit\u id
-
那么现在在上面的SELECT查询中应该出现什么,以便它也可以处理主键
emp\u audit\u id
。因为您不想在INSERT
语句中写出字段列表(其他读者:请参阅下面的注释),您需要使用常规的整数
作为主键
和手动创建的序列
首先更改emp\u审计
表定义:
ALTER TABLE emp_audit ADD COLUMN emp_audit_id integer PRIMARY KEY
创建序列:
CREATE SEQUENCE seq_empaudit_pk;
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*, nextval(seq_empaudit_pk);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*, nextval(seq_empaudit_pk);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*, nextval(seq_empaudit_pk);
RETURN NEW;
END IF;
在INSERT
语句中,添加序列中的下一个值:
CREATE SEQUENCE seq_empaudit_pk;
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*, nextval(seq_empaudit_pk);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*, nextval(seq_empaudit_pk);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*, nextval(seq_empaudit_pk);
RETURN NEW;
END IF;
请确保在更改表后验证字段的顺序,并在
SELECT
查询中按该顺序列出字段。这没有帮助。我也试过了,发现它对触发器不起作用。字段列表发生了变化,因此INSERT
语句需要实际的字段列表,而不是省略时的隐式完整列表。请参阅更新的答案。我认为这是一个坏主意,因为我有许多列,需要在INSERT查询中列出它们。所以我想避开主键。但是建议在历史记录表中添加主键吗?我不会说这个想法不好,你只是不喜欢长语句。除此之外,您可以使用一个简单的整数
作为主键
,并手动创建一个序列,让它在INSERT
语句的SELECT
查询中发出一个新值。在这种情况下,您将再次使用审计表的所有字段,这样您就可以省略字段列表。在您最近的更新之前,我在INSERT语句中编写了字段列表,它运行良好。但现在我在想,如果我必须在不久的将来向表中添加任何新列,那么我必须在触发器的SELECT查询中进行更改,以添加额外的列。这不是额外的开销吗?