PostgreSQL копировать в новую таблицу с одним дополнительным столбцом. Как? - PullRequest
2 голосов
/ 26 января 2020

Я пытаюсь создать базу данных форума, и в этой базе данных у меня есть триггер. После вставки он должен скопировать значения другой таблицы в новую, но также должен создать новый столбец, показывающий фактическую дату регистрации пользователя. Вот код триггера:

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();

Когда я пытаюсь это сделать, он говорит мне следующее:

ОШИБКА Запись "new" не имеет поля "registerdate" CONTEXT: SQL оператор "INSERT INTO publi c .freshlyinserted (user_id, username, bday, пол, uemail, pasword) ЗНАЧЕНИЯ (NEW.user_id, NEW.username, NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, NEW .registerdate)». Функция PL / pgSQL insertuser () строка 2 для оператора SQL

В таблице forumuser нет столбца «registerdate» ... но мне бы очень хотелось, чтобы новая таблица с фактическая дата (я не знаю, как это сделать, хотя) Я был бы счастлив, если бы мне помогли с этим. Я выложу больше необходимого кода! Btw. Без зарегистрированной даты это работает ... но тогда таблица не будет иметь смысла для меня XD

Спасибо! :)

Ответы [ 3 ]

1 голос
/ 26 января 2020

Просто используйте 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

0 голосов
/ 27 января 2020

Не нужно менять триггер, вы можете использовать предложение DEFAULT при создании / изменении таблицы.

ALTER TABLE public.freshlyinserted
    ALTER COLUMN registerdate
        SET DEFAULT now();
0 голосов
/ 26 января 2020

Если я правильно понимаю, просто замените NEW.registerdate на текущую дату, для которой вы можете использовать функцию NOW ()

...