Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中插入触发器的自动增量值?_Sql_Postgresql_Triggers - Fatal编程技术网

如何在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查询中进行更改,以添加额外的列。这不是额外的开销吗?