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();
我正在尝试创建一个论坛数据库,在这个数据库中我有一个触发器。在插入之后,它应该将另一个 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();