Я новичок в PostgreSQL, и у меня возникли проблемы с правильным кодированием триггера AFTER INSERT (и мне не удалось найти пример, соответствующий моей конкретной потребности). У меня есть две таблицы, каждая из которых содержит несколько столбцов, одна из которых используется совместно с таблицами (sampleid). Когда новые строки вставляются в table1 и sampleid в этих строках НЕ NULL, я хочу, чтобы триггер сработал и скопировал вставленные sampleid в table2. Когда table1.sampleid имеет значение NULL, и триггер не должен срабатывать.
Мои (упрощенные) таблицы следующие:
CREATE TABLE table1 (
a_id SERIAL PRIMARY KEY,
species CHAR(4),
sampleid TEXT);
CREATE TABLE table2 (
sampleid TEXT PRIMARY KEY,
replicate INTEGER,
bd DOUBLE PRECISION);
А вот функция триггера и триггер:
CREATE OR REPLACE FUNCTION func_sampleid_copy()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.sampleid IS NOT NULL THEN
INSERT INTO table2 (sampleid)
VALUES(NEW.sampleid);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER trig_sampleid_copy
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE func_sampleid_copy();
Если я вставляю две строки в table1, в одной из которых sampleid не равно NULL, а в другой - NULL
INSERT INTO table1 (species, sampleid)
VALUES ('RACA', 'XXX100'), ('AMMA', '');
Я ожидал, что одно значение sampleid будет скопировано в table2 (т.е. XXX100). Вместо этого запрос table2 (SELECT * FROM table2) показывает две строки, в одной из которых sampleid не равно null, а в другой - null). Что мне нужно изменить в моей функции триггера / триггера, чтобы гарантировать, что нулевые значения sampleid не копируются в table2? Связанный вопрос, предложенный @dmfay, не был особенно ясным, и я бы предположил, что на самом деле это не дубликат.
Это не дубликат точный, а tl; dr: используйте предложение WHEN вместо условного оператора в теле триггера.
'' - это не NULL, а пустая строка.
@Abelisto Спасибо за разъяснения. Трудно быть новичком ....
Итак, вся проблема заключалась в сравнении NULL и '' - как заметил @Abelisto? Предлагаю закрыть вопрос тогда.





Комментарий @Abelisto дал ответ на мой вопрос. Когда я добавил в table1 значения NULL (вместо пустых строк), триггер и триггерные функции работали должным образом.
Возможный дубликат Postgres вставляет или обновляет триггер КОГДА условие (старое)