我是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提出的相关问题并不是特别清楚,我建议它并不是真的重复。
答案 0 :(得分:1)
@Abelisto的评论提供了我的问题的答案。当我向table1添加NULL值(而不是空字符串)时,触发器和触发器函数按预期工作。