5

Я хочу добавить проверку на уровне поля на таблицу. Существует поле под названием «account_number», и это поле должно всегда проходить проверку «luhn». Я нашел функцию под названием «luhn_verify», которая, кажется, работает правильно (google для нее, если вам интересно). Он возвращает логическое значение. Мой вопрос:Trigger vs. check constraint

Есть ли существенные преимущества в производительности PostgreSQL для использования триггера для этой проверки по сравнению с контрольным ограничением.

Дополнительная информация:

  • PostgreSQL 9.1
  • Таблица в настоящее время не имеет триггер вставки, но есть обновление.

Отказ от ответственности:

Я чувствую, что это, вероятно, уже был дан ответ, но я не могу найти четкий ответ. Если это так, отметьте как дубликат, так и исходный вопрос/ответ.

Возможно, вопросы лучше для доски dba.

+0

Я не ожидаю каких-либо значимых различий. Трудно тестировать, и это всегда хорошая идея для тестирования в вашей конкретной среде. – maniek

ответ

8

Правило большого пальца - использовать ограничение CHECK, прежде чем прибегать к триггерам.

A CHECK constraint более быстрый, простой, портативный, требует меньше кода и менее подвержен ошибкам. Например, триггеры можно легко обойти другими триггерами.

Triggers are much more complicated. Используйте их, когда вы должны, для более сложных требований.

Если ограничение CHECK является слишком ограничительным для вашего случая или вызывает проблемы с перезагрузкой дампа, вы можете использовать модификатор NOT VALID в качестве промежуточного заземления (стр. 9.2+). Реквизиты:

+0

@Erwin, что вы думаете, является полезной нагрузкой, чтобы иметь или не проверять ограничение, например, не пустое, в PostgreSQL 9.x? –

+0

@ErwinBrandstetter всегда прав! http://stackoverflow.com/questions/19137811/how-much-cost-check-constraints-in-postgres-9-x –

+1

@Erwin в моем опыте postgres рассматривает проверки ограничений и триггеры по-разному, когда восстанавливается база данных, а именно триггеры можно игнорировать, но контрольных ограничений не может быть, поэтому в зависимости от ограничения можно столкнуться с более сложным восстановлением при использовании проверочных ограничений. – rapvelopment