Как проверить в триггере, если вся строка остается неизменной после обновления?


11

Конечно, я мог бы сделать это для каждого столбца, сравнивая это так:

if (old.column1 = new.column1 and old.column2 = new.column2...)

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

Есть ли способ проверить, все ли столбцы остаются одинаковыми, не проверяя каждый отдельный столбец вручную?


Можете ли вы использовать EXCEPT - techonthenet.com/postgresql/except.php
Скотт Ходжин

Извините, но как ИСКЛЮЧИТЬ использование в моем случае? Я пытаюсь сравнить старую строку с новыми значениями строки, из того, что я знаю, КРОМЕ она используется для сравнения существующих строк из двух запросов, а не в старом / новом контексте триггера ...
Mateus Viccari

Я не знаком с вашей базой данных - есть ли способ выбрать новый. * Кроме выбора старого. *? Если rowcount = 0, строки не изменились
Скотт Ходжин

Ответы:


15

Вы можете просто сравнить записи oldи newзаписи, используя is not distinct fromкоторые правильно обрабатывают значения NULL (если все столбцы определены как NOT NULL, вы можете просто использовать =или <>)

if old is not distinct from new then 
   .... do something
end if;

То же самое можно сделать, чтобы проверить, изменился ли хотя бы один столбец:

if old is distinct from new then 
   .... do something
end if;

Как NULLs обрабатываются этими условиями?
ypercubeᵀᴹ 9.09.16

@ ypercubeᵀᴹ: хорошая мысль. Я обновил свой ответ.
a_horse_with_no_name

Thnx. Я сделал быструю проверку и кажется, что old=newобрабатывает дело так же, как old is not distinct from old. Другими словами, я не мог найти случай, когда old=newдает нулевой результат. Я этого не ожидал!
ypercubeᵀᴹ 9.09.16

Я думаю, что разница будет с, old <> newно я не совсем уверен.
a_horse_with_no_name
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.