插入后PostgreSQL触发器的意外行为

插入后PostgreSQL触发器的意外行为,postgresql,function,plpgsql,database-trigger,Postgresql,Function,Plpgsql,Database Trigger,我是PostgreSQL的新手,在正确编写插入后触发器时遇到了问题,并且没有找到符合我特定需要的示例。我有两个表,每个表包含几列,其中一列在表sampleid之间共享。当新行插入到表1中并且这些行中的sampleid不为NULL时,我希望触发器触发并将插入的sampleid复制到表2中。当table1.sampleid为NULL且不希望触发时 我的简化表格如下: CREATE TABLE table1 ( a_id SERIAL PRIMARY KEY, species CHAR(4), sam

我是PostgreSQL的新手,在正确编写插入后触发器时遇到了问题,并且没有找到符合我特定需要的示例。我有两个表,每个表包含几列,其中一列在表sampleid之间共享。当新行插入到表1中并且这些行中的sampleid不为NULL时,我希望触发器触发并将插入的sampleid复制到表2中。当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不为null,另一行为null

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

我希望sampleid的单个值会复制到表2中,即XXX100。取而代之的是,对table2的查询SELECT*FROM table2显示了两行,一行中sampleid不为null,另一行中sampleid为null。我需要在触发器/触发器函数中更改什么以确保sampleid的空值不会复制到表2中?@dmfay提出的相关问题并不特别清楚,我认为这并不是真正的重复

@Abelisto的评论为我的问题提供了答案。当我在表1中添加空值而不是空字符串时,触发器和触发器函数按预期工作

可能的复制品不是完全的复制品,而是tl;dr:在触发器主体中使用WHEN子句而不是条件。不是空字符串,而是空字符串。@Abelisto感谢您的澄清。作为一个noob是很难的…那么NULL vs.整个问题是否像@Abelisto发现的那样?那么我建议结束这个问题。