AFTER INSERT PostgreSQL触发器的意外行为

时间:2018-04-20 02:48:11

标签: postgresql function plpgsql database-trigger

我是PostgreSQL的新手,并且无法正确编码AFTER INSERT触发器(并且无法找到符合我特定需求的示例)。我有两个表,每个表包含几个列,其中一个表在表之间共享(sampleid)。当新行插入table1并且那些行中的sampleid为IS NOT NULL时,我希望触发器触发并将插入的sampleid复制到table2。当table1.sampleid为NULL时,并且不希望触发器触发。

我的(简化)表格如下:

CREATE TABLE table1 (
a_id SERIAL PRIMARY KEY,
species CHAR(4),
sampleid TEXT);

CREATE TABLE table2 (
sampleid TEXT PRIMARY KEY,
replicate INTEGER,
bd DOUBLE PRECISION);

这是触发功能和触发器:

CREATE OR REPLACE FUNCTION func_sampleid_copy()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.sampleid IS NOT NULL THEN
INSERT INTO table2 (sampleid)
VALUES(NEW.sampleid);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER trig_sampleid_copy
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE func_sampleid_copy();

如果我在table1中插入两行,其中一行不是null,另一行是null

INSERT INTO table1 (species, sampleid) 
VALUES ('RACA', 'XXX100'), ('AMMA', '');

我希望将一个sampleid值复制到table2(即XXX100)。而是对table2(SELECT * FROM table2)的查询显示两行,一行中sampleid不为null,另一行为null。我需要在触发器/触发器函数中进行哪些更改以确保sampleid的空值不会复制到table2? @dmfay提出的相关问题并不是特别清楚,我建议它并不是真的重复。

1 个答案:

答案 0 :(得分:1)

@Abelisto的评论提供了我的问题的答案。当我向table1添加NULL值(而不是空字符串)时,触发器和触发器函数按预期工作。