У меня есть упрощенная функция, определенная примерно так (многие столбцы и параметры удалены):
CREATE OR REPLACE FUNCTION write_no_duplicates(
IN p_foreign_key BIGINT
, IN p_write_value TEXT
, OUT output my_table
)
LANGUAGE plpgsql AS $$
BEGIN
SELECT *
INTO STRICT output
FROM my_table
WHERE my_table.foreign_key = p_foreign_key
AND (my_table.write_value = p_write_value
OR (my_table.write_value IS NULL AND p_write_value IS NULL));
EXCEPTION WHEN NO_DATA_FOUND THEN
INSERT INTO my_table (foreign_key, write_value)
VALUES (p_foreign_key, p_write_value)
RETURNING *
INTO STRICT output;
END $$;
Цель функции - написать новую строку, но предотвратить дублирование.Мы не используем уникальное ограничение из-за размера и ширины таблицы, и мы не возражаем, если запись будет медленнее.
Мой вопрос состоит из двух частей:
- Есть ли лучший способ выполнить нулевое сравнение?
- Есть ли лучший способ обеспечить уникальность?
Спасибо, что уделили время!