Есть ли несоответствие в синтаксисе PostgreSQL для добавления ограничений в таблицу? - PullRequest
0 голосов
/ 05 июля 2018

Из документа PostgreSQL

Чтобы добавить ограничение, используется синтаксис ограничения таблицы. Например:

ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;

Чтобы добавить ненулевое ограничение, которое нельзя записать в виде таблицы ограничение, используйте этот синтаксис:

ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;

Почему слово после ADD отличается для разных видов ограничений?

Почему уникальное ограничение имеет более общий ADD CONSTRAINT some_name, чем чек и внешний ключ?

Почему не указано нулевое ограничение ALTER COLUMN вместо ADD CONSTRAINT some_name NOT NULL (col_name)?

Есть ли несоответствие в синтаксисе PostgreSQL при добавлении ограничений в таблицу? Это относится к стандарту SQL?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Слово после 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, которое может использовать любое логическое выражение.

0 голосов
/ 05 июля 2018

Мы не можем использовать синтаксис добавления ограничений для Not Null. Вы должны использовать изменить синтаксис столбца, чтобы добавить не нуль например. изменить таблицу изменить (не ноль);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...