AFTER INSERT PostgreSQL 触发器的意外行为

Unexpected behavior of AFTER INSERT PostgreSQL trigger

我是 PostgreSQL 的新手,在正确编码 AFTER INSERT 触发器时遇到问题(并且无法找到符合我特定需要的示例)。我有两个表,每个表都包含多个列,其中一个在表之间共享 (sampleid)。当新行插入到 table1 并且这些行中的 sampleid 为 NOT NULL 时,我希望触发触发器并将插入的 sampleids 复制到 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();

如果我向表 1 中插入两行,其中 sampleid 不为空,而另一行为空

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

我预计 sampleid 的单个值将被复制到表 2(即 XXX100)。相反,对 table2 (SELECT * FROM table2) 的查询显示两行,其中 sampleid 不为空,另一行为空)。我需要在 trigger/trigger 函数中更改什么以确保不会将 sampleid 的空值复制到 table2? @dmfay 提出的相关问题不是特别清楚,我认为它并不是真正的重复问题。

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