Изменить столбец таблицы, чтобы добавить ограничение и где столбец не является нулевым - PullRequest
0 голосов
/ 22 июля 2011

У меня есть это:

alter table supplier
add constraint supplier_unique
unique (supplier_id) where supplier_id is not null;

но я получаю ошибку.

Полученное определение должно быть:

CREATE UNIQUE INDEX supplier_unique
ON supplier (supplier_id) WHERE (supplier_id IS NOT NULL)

Спасибо.

1 Ответ

4 голосов
/ 22 июля 2011

A уникальное ограничение в PostgreSQL не имеет предложения WHERE, поэтому вы получаете синтаксическую ошибку в "где".В любом случае, supplier_id is not null не является обязательным с уникальным ограничением:

В общем случае уникальное ограничение нарушается, когда в таблице более одной строки, где находятся значения всех столбцоввключены в ограничение равны.Однако два нулевых значения не считаются равными в этом сравнении.Это означает, что даже при наличии уникального ограничения можно хранить повторяющиеся строки, которые содержат нулевое значение, по крайней мере, в одном из ограниченных столбцов.Это поведение соответствует стандарту SQL, ...

Так что все, что вам нужно, это:

alter table supplier
add constraint supplier_unique
unique (supplier_id);

И ваше уникальное ограничение будет добавлено, вы можете иметь несколько строк сsupplier_id IS NULL, и вы получите свой индекс как побочный эффект ограничения уникальности.

Однако, если вы хотите создать индекс напрямую, вы можете создать частичный индекс сПредикат:

При наличии предложения WHERE создается частичный индекс.Частичный индекс - это индекс, который содержит записи только для части таблицы, обычно для части, которая более полезна для индексации, чем остальная часть таблицы.
[...]
Другое возможное приложение - это использованиеГДЕ с UNIQUE для обеспечения уникальности над подмножеством таблицы.

Но в случае NULL частичный индекс для supplier_id IS NOT NULL ничего не сделает для уникальности, потому что уникальные ограничения PostgreSQL уже позволяютнесколько значений NULL (вероятно, из-за стандарта и потому, что x = NULL является ложным для всех x).

Так что, если ваше намерение слишком ограничивает уникальность значениями, отличными от NULL, то вам не нужночастичный индекс;но, если вы просто хотите избежать индексации значений NULL, вы можете сделать это с помощью CREATE INDEX (но не ALTER TABLE).Я не знаю, будет ли какое-либо заметное влияние исключение NULL из вашего индекса.

Я думаю, что часть путаницы (вашей и моей) заключается в том, что UNIQUE - это и ограничение, и индекс.Вы можете включить WHERE, когда создаете его как индекс, но не когда вы создаете его как ограничение.Это, безусловно, противоречиво.

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