Слово после ADD
отличается, поэтому база данных знает, что вы имеете в виду. Например. CHECK
вводит общее логическое условие; UNIQUE
сопровождается списком имен столбцов; FOREIGN KEY
сопровождается именем столбца, REFERENCES
и целевой таблицей / столбцом. Без этих ключевых слов было бы неоднозначно, какое ограничение вы имеете в виду.
Синтаксис CONSTRAINT <i>constraint_name</i>
не ограничен уникальными ограничениями. См. Определения column_constraint
и table_constraint
в https://www.postgresql.org/docs/10/static/sql-createtable.html;, оба позволяют опциональному ведущему CONSTRAINT <i>constraint_name</i>
назвать ограничение.
Что касается NOT NULL
, см. https://www.postgresql.org/docs/10/static/ddl-constraints.html#id-1.5.4.5.6:
Не пустое ограничение всегда записывается как ограничение столбца. Не ненулевое ограничение функционально эквивалентно созданию проверочного ограничения CHECK (<i>column_name</i> IS NOT NULL)
, но в PostgreSQL создание явного ненулевого ограничения более эффективно. Недостатком является то, что вы не можете дать явные имена ограничениям, не равным NULL, созданным таким образом.
Я предполагаю, что ненулевые ограничения являются частным случаем внутри страны, что обеспечивает лучшую оптимизацию, чем общее ограничение CHECK
, которое может использовать любое логическое выражение.