w14243 Ответов: 1

Сервер SQL: создание таблицы со столбцами, которые поддерживают уникальную и несколькими нулями


SQL server 2014/16.

Хочу создать таблицу. В таблице есть несколько столбцов, которые нуждаются в поддержке:
1. может содержать несколько нулей.
2. Если не null, то должен быть уникальным.
3. столбцы не имеют никакого отношения.
4. не вся строка уникальна. Каждая колонка уникальна.

Как сделать команду CREATE TABLE?

Похоже, что SQL server может поддерживать только один null при использовании UNIQUE.

Ниже приведен пример того, что я хотел:
Создать таблицу UniqueTest (
col1 int,
col2 int unique null
);

Вставить в UniqueTest значения (1, 1);
-- УСПЕХ

Вставить в UniqueTest значения (2, 2);
-- УСПЕХ

Вставить в UniqueTest значения (3, 2);
-- ПОТЕРПЕТЬ НЕУДАЧУ

Вставить в UniqueTest значения (4, NULL);
-- УСПЕХ

Вставить в UniqueTest значения (5, NULL);
-- УСПЕХ


Я искал в интернете, много статей обсуждается в старой версии SQL server, например, 2005/2008.
Я думаю, что SQL server 2014/2016 имеет новую опцию CREATE TABLE, чтобы удовлетворить мои требования, но я не знаю.

Что я уже пробовал:

Решение из интернета было бы следующим:
создайте индекс для определенного столбца.

Но:
1.My таблица будет иметь 10~30 столбцов, которые нуждаются в уникальности и нулях. Если каждый столбец создать индекс, то в таблице будет 10~30 индексов. Возможно ли это?
2. индексы лотов будут снижать эффективность. Так ли это?

1 Ответов

Рейтинг:
2

Wendelius

Если я правильно понял вопрос, вы могли бы использовать unique index чтобы обеспечить соблюдение логики.

Рассмотрим следующий тест

CREATE TABLE UniqueTest (
   col1 int,
   col2 int
);

CREATE UNIQUE INDEX U_UniqueTest ON UniqueTest (col1, col2);

-- Test variations

INSERT INTO UniqueTest VALUES (1, 1);
-- SUCCESS

INSERT INTO UniqueTest VALUES (1, 2);
-- SUCCESS

INSERT INTO UniqueTest VALUES (1, NULL);
-- SUCCESS

INSERT INTO UniqueTest VALUES (NULL, 1);
-- SUCCESS

INSERT INTO UniqueTest VALUES (NULL, NULL);
-- SUCCESS

-- RE-RUN
INSERT INTO UniqueTest VALUES (1, 1);
-- Cannot insert duplicate key row in object 'dbo.UniqueTest' with unique index 'U_UniqueTest'. The duplicate key value is (1, 1).

INSERT INTO UniqueTest VALUES (1, 2);
-- Cannot insert duplicate key row in object 'dbo.UniqueTest' with unique index 'U_UniqueTest'. The duplicate key value is (1, 2).

INSERT INTO UniqueTest VALUES (1, NULL);
-- Cannot insert duplicate key row in object 'dbo.UniqueTest' with unique index 'U_UniqueTest'. The duplicate key value is (1, <NULL>).

INSERT INTO UniqueTest VALUES (NULL, 1);
-- Cannot insert duplicate key row in object 'dbo.UniqueTest' with unique index 'U_UniqueTest'. The duplicate key value is (<NULL>, 1).

INSERT INTO UniqueTest VALUES (NULL, NULL);
-- Cannot insert duplicate key row in object 'dbo.UniqueTest' with unique index 'U_UniqueTest'. The duplicate key value is (<NULL>, <NULL>).


Wendelius

Я вижу, вы скопировали мое решение вашего вопроса. Я так понимаю, что с ним были какие-то проблемы, так что не могли бы вы объяснить, с какими проблемами вы столкнулись?