【问题标题】:PostgreSQL copy to a new table with one extra column. How?PostgreSQL 复制到带有一个额外列的新表。如何?
【发布时间】:2020-01-26 16:09:27
【问题描述】:

我正在尝试创建一个论坛数据库,并且在这个数据库中我有一个触发器。在插入之后,它应该将另一个表的值复制到新表中,但还应该创建一个新列来显示用户的实际注册日期。 这是触发代码:

Create OR REPLACE FUNCTION insertUser() RETURNS TRIGGER AS $insertUser$

BEGIN 

    INSERT INTO public.freshlyinserted(user_id, username, bday, gender, uemail, pasword)
    VALUES (NEW.user_id, NEW.username, NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, NEW.registerdate);

RETURN NEW;
END;
$insertUser$ LANGUAGE plpgsql;

CREATE TRIGGER moveUserToInserted
AFTER INSERT ON forumusers
FOR EACH ROW EXECUTE PROCEDURE insertUser();

当我尝试这个时,它告诉我:

ERROR Record "new" has no field "registerdate" CONTEXT: SQL 语句 "插入到 public.freshlyinserted(user_id, 用户名, bday, 性别, uemail,密码)值(NEW.user_id,NEW.username,NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, NEW.registerdate)”。PL/pgSQL 用于 SQL 语句的函数 insertuser() 第 2 行

forumuser 表没有“registerdate”列...但我真的很希望它用于带有实际日期的新表(我不知道该怎么做)。如果我能得到这方面的帮助,我会很高兴。我将发布更多需要的代码! 顺便提一句。没有注册日期,它可以工作......但是表格对我来说毫无意义 XD

谢谢! :)

【问题讨论】:

    标签: sql database postgresql triggers postgresql-triggers


    【解决方案1】:

    只需像这样使用 current_date

    Create OR REPLACE FUNCTION insertUser() RETURNS TRIGGER AS $insertUser$
    
    BEGIN 
    
        INSERT INTO public.freshlyinserted(user_id, username, bday, gender, uemail, pasword)
        VALUES (NEW.user_id, NEW.username, NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, current_date);
    
    RETURN NEW;
    END;
    $insertUser$ LANGUAGE plpgsql;
    
    CREATE TRIGGER moveUserToInserted
    AFTER INSERT ON forumusers
    FOR EACH ROW EXECUTE PROCEDURE insertUser();
    

    您也可以使用 current_timestamp

    在这里你可以看到当你使用它们时它们会返回或保存什么:https://dbfiddle.uk/?rdbms=postgres_12&fiddle=57bae2ba351bac477724aa5551c73ee2

    【讨论】:

    • 非常感谢!现在它可以工作了:) 我还发现我忘了把 registerdate 放在 INSERT INTO 中新插入的表中...... XD 再次感谢!
    【解决方案2】:

    如果我理解正确,只需将 NEW.registerdate 替换为您可以使用函数 NOW() 的当前日期

    【讨论】:

    • 所以你的意思是这样的:VALUES (NEW.user_id, NEW.username, NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, GETDATE());这行不通;我又得到一个错误:错误:函数getdate()不存在也许我只是愚蠢XD
    • 我在发布后编辑了我的答案,但猜你读得太早了。您正在使用 postgres,因此 GETDATE() 不存在,但您可以使用 NOW() 代替。
    【解决方案3】:

    不需要更改触发器,您可以在创建/更改表时使用DEFAULT子句。

    ALTER TABLE public.freshlyinserted
        ALTER COLUMN registerdate
            SET DEFAULT now();
    

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 2016-05-26
      • 1970-01-01
      • 2021-02-02
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多