【发布时间】:2018-04-20 02:48:11
【问题描述】:
我是 PostgreSQL 新手,在正确编码 AFTER INSERT 触发器时遇到问题(并且无法找到符合我特定需求的示例)。我有两个表,每个表都包含几列,其中一个在表之间共享(sampleid)。当新行插入 table1 并且这些行中的 sampleid 不是 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();
如果我在table1中插入两行,其中一个sampleid不为空,另一行为空
INSERT INTO table1 (species, sampleid)
VALUES ('RACA', 'XXX100'), ('AMMA', '');
我希望将 sampleid 的单个值复制到 table2(即 XXX100)。相反,table2 (SELECT * FROM table2) 的查询显示了两行,其中一个 sampleid 不为空,另一个为空)。我需要在触发器/触发器函数中进行哪些更改以确保不将 sampleid 的空值复制到 table2? @dmfay 提出的相关问题并不是特别清楚,我建议它并不是真正的重复。
【问题讨论】:
-
它不是 exact 重复项,而是 tl;dr:使用
WHEN子句而不是触发器正文中的条件。 -
''不是NULL而是空字符串。 -
@Abelisto 感谢您的澄清。作为一个菜鸟很难......
-
所以
NULL与''是整个问题——就像@Abelisto 发现的那样?我建议关闭这个问题。
标签: postgresql function plpgsql database-trigger