【问题标题】:Unexpected behavior of AFTER INSERT PostgreSQL triggerAFTER INSERT PostgreSQL 触发器的意外行为
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多