Postgresql 将IFTHEN条件放入触发器函数

Postgresql 将IFTHEN条件放入触发器函数,postgresql,Postgresql,我有两张桌子 主表 子表 我的意图是,如果新行满足列不为Null的条件,则使用触发器函数将其插入子表中 我已经尝试过这个方法,但是我的子表仍然会插入空值的行 BEGIN INSERT INTO unsubscriber_list("ID","Name","Email","unsubdate") SELECT new."ID",new."Name",new."Email",new."date_of_unsub" FROM master_database WHERE date

我有两张桌子

  • 主表

  • 子表

  • 我的意图是,如果新行满足列不为Null的条件,则使用触发器函数将其插入子表中

    我已经尝试过这个方法,但是我的子表仍然会插入空值的行

    BEGIN
        INSERT INTO unsubscriber_list("ID","Name","Email","unsubdate")
        SELECT new."ID",new."Name",new."Email",new."date_of_unsub" FROM master_database
        WHERE date_of_unsub IS NOT NULL
        ORDER BY "account_created_on" DESC LIMIT 1;
        RETURN NULL;
    END;
    
    我也尝试了IFTHEN条件,但它会产生错误

    BEGIN
        IF master_database.date_of_unsub IS NOT NULL THEN
        INSERT INTO unsubscriber_list("ID","Name","Email","unsubdate")
        SELECT new."ID",new."Name",new."Email",new."date_of_unsub" FROM master_database;
        END IF;
        RETURN NULL;
    END;
    
    这就是他们所显示的错误

    ERROR:  missing FROM-clause entry for table "master_database"
    LINE 1: SELECT master_database.date_of_unsub IS NOT NULL
    
    我的预期结果是,插入触发器激活触发器函数,从而验证特定列是否为NULL

    如果为空:忽略
    如果不为Null:Insert。

    在使用我的代码之后,似乎我已经解决了这个问题

    我使用了IFTHEN函数并添加了一个新的(根据postgresql,这是一个特殊的变量,它是为触发器函数自动创建的,用于保存新创建的行)

    这是我的密码

    BEGIN
        IF NEW.date_of_unsub IS NOT NULL THEN
        INSERT INTO unsubscriber_list("ID","Name","Email","unsubdate")
        SELECT NEW."ID",NEW."Name",NEW."Email",NEW."date_of_unsub" FROM master_database;
        END IF;
        RETURN NULL;
    END;
    
    我通过插入一个脚本测试了这个函数,它似乎创建了适当的行,而忽略了不适当的行


    再说一次,我是Postgresql的新手,所以我可能没有最好的代码。将寻找更清洁的方法来产生这样的功能

    您有一个名为“new”的别名标签,但没有定义它。嗨,Philip!你能再解释一下吗?我完全是个新手,因为未定义的表别名“new”,您的两个查询都会触发错误。然而,根据你的描述,第一个(部分)有效。我想知道你是否修改了一点,遗漏了一些部分。菲利普,谢谢你抽出时间来解决我的问题。我在谷歌上搜索了更多关于New的信息,它似乎是一个自动创建的特殊变量。新的数据类型记录;在行级触发器中保存用于插入/更新操作的新数据库行的变量。对于语句级触发器和删除操作,此变量为null。我利用这一新知识对代码进行了修改,解决了这个问题。当我整理代码时,我将发布答案。再次感谢@PhilipZou:trigger函数会自动提供
    new
    记录。该函数看起来正常,只是您应该
    返回new
    。为什么要从
    master\u数据库中选择
    new
    值?
    master_数据库
    表(我假设是这样)与
    NEW
    row变量无关。如果您想选择新的值,只需插入到。。。值(新的“ID”、新的“名称”和…)
    。为了便于阅读,还可以在
    IF
    块中缩进代码。