Как сделать столбец пустым или уникальным? - PullRequest
3 голосов
/ 28 мая 2009

Я видел несколько поисковых запросов и ответов на них, но, похоже, все они связаны с просмотрами.

Как настроить столбец так, чтобы он допускал только NULL или уникальное значение?

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

Кроме того, я не могу изменить архитектуру, поскольку пишу новый интерфейс для еще живого сайта.

Ответы [ 8 ]

6 голосов
/ 28 мая 2009

В MySQL столбец UNIQUE, который также может иметь значение null, допускает любое количество нулей (во всех движках). Поэтому, если вы используете MySQL, просто добавьте ограничение UNIQUE к интересующему столбцу. Такое поведение является стандартом SQL и также поддерживается PostgreSQL и SQLite (и, по-видимому, Oracle только для ограничения в один столбец UNIQUE, хотя я не могу это подтвердить).

Однако это стандартное поведение SQL не обязательно будет работать для всех других механизмов СУБД, таких как SQL Server или DB2; если вы укажете, какие движки вам необходимо поддерживать, мы можем предложить более конкретные предложения.

4 голосов
/ 28 мая 2009

SQL Server позволяет создавать UNIQUE индексы, которые принимают значения NULL, хотя это требует небольшой хитрости.

Создайте представление, которое выбирает только не NULL столбцы, и создайте UNIQUE INDEX в представлении:

CREATE VIEW myview
AS
SELECT  *
FROM    mytable
WHERE   mycolumn IS NOT NULL

CREATE UNIQUE INDEX ux_myview_mycolumn ON myview (mycolumn)

Обратите внимание, что вам нужно выполнить INSERT и UPDATE для представления вместо таблицы.

Вы можете сделать это с помощью триггера INSTEAD OF:

CREATE TRIGGER trg_mytable_insert ON mytable
INSTEAD OF INSERT
AS
BEGIN
        INSERT
        INTO    myview
        SELECT  *
        FROM    inserted
END
2 голосов
/ 28 мая 2009

Если вы используете MS SQL Server 2008 , то для этого можно использовать отфильтрованный уникальный индекс. Посмотрите эту ветку форума для подробностей.

0 голосов
/ 08 июня 2011

Для Sql Server 2008 приведена копия решения с отфильтрованным индексом, связанного с MattB. Я пишу здесь, чтобы люди не пропустили:

CREATE UNIQUE NONCLUSTERED INDEX [UniqueExceptNulls]
ON [Customers] (SSN)
WHERE [SSN] IS NOT NULL
0 голосов
/ 28 мая 2009

Для какой платформы это нужно?

Для SQL Server см. Это сообщение в блоге , в котором показан метод с использованием индексированных представлений.

0 голосов
/ 28 мая 2009

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

0 голосов
/ 28 мая 2009

Вместо этого вы можете сделать это с помощью триггера ...

Индексировать столбец, но без уникального ограничения Разрешить нули Вставьте в таблицу триггер, чтобы при INSERT и UPDATE вы проверяли, равно ли значение столбца, которое вы пытаетесь вставить, на NULL или его нет в таблице

0 голосов
/ 28 мая 2009

Можете ли вы подтвердить с внешнего интерфейса? Прежде чем вставлять или фиксировать данные, убедитесь, что они уникальны или имеют значение NULL.

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