PostgreSQL 复制到一个新的 table 和一个额外的列。如何?

PostgreSQL copy to a new table with one extra column. How?

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

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 statement "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)". PL/pgSQL function insertuser() row 2 for SQL statement

论坛用户 table 没有 "registerdate" 栏...但我真的很想要新的 Table 和实际日期(我不知道如何这样做吧)。如果我在这方面得到帮助,我会很高兴。我会post任何更多需要的代码! 顺便提一句。没有注册日期,它可以工作......但是 table 对我来说毫无意义 XD

谢谢! :)

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

的当前日期

只需像这样使用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

在这里您可以看到它们 return 或在您使用它们时保存的内容:https://dbfiddle.uk/?rdbms=postgres_12&fiddle=57bae2ba351bac477724aa5551c73ee2

不需要更改触发器,您可以使用 DEFAULT 子句 while creating/altering a table.

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