Согласно CREATE INDEX
документации:
До 16 столбцов могут быть объединены в один составной индексный ключ.
У нас есть таблица с ~ 18 столбцами, которые должны сформировать уникальную комбинацию. Эта таблица не зависит от производительности - мы редко обновляем значения / вставляем записи. Нам просто нужно убедиться, что мы не дублируем наши записи ... и думали, что можем наложить простое ограничение уникальности.
Любые идеи? Я открыт, чтобы полностью избежать уникального индекса / ограничения, если есть лучший способ.
Ответы:
Добавьте постоянный вычисляемый столбец, который объединяет 18 ключей, затем создайте уникальный индекс для вычисляемого столбца:
См. Создание индексов для вычисляемых столбцов .
Другой подход заключается в создании индексированного представления:
См. Создание индексированных представлений .
Оба подхода допускают частичную агрегацию ключей: агрегат c1 + c2 + c3 как k1, c4 + c5 + c6 как k2 и т. Д., Затем индексирование / создание индексированного представления (k1, k2, ...). Это может быть полезно для сканирования диапазона (индекс может использоваться для поиска по c1 + c2 + c3.
Конечно, все
+
операции в моем примере являются агрегацией строк, фактический используемый оператор зависит от типов всех этих столбцов (т. Е. Вам, возможно, придется использовать явное приведение).PS. Так как уникальные ограничения применяются уникальным индексом, любое ограничение уникальных индексов будет применяться и к уникальным ограничениям:
Однако создание ограничения для сохраняемого вычисляемого столбца работает:
Очевидно, что постоянный столбец занимает место на диске, поэтому подход может быть плох для очень большой таблицы. Подход с индексированным представлением не имеет этой проблемы, он только использует пространство для индекса , а не пространство для вычисляемого столбца и индекса.
источник
Я думаю, что вам лучше бы поставить свою уникальную проверку индекса для вычисляемого столбца, который генерируется с использованием
HASHBYTES('MD5', ...)
комбинации из ваших 18 столбцов.источник
Я столкнулся с этой проблемой, и мой старший администратор БД предложил использовать функцию проверки уникальности. Мои вставки являются относительно небольшими и редкими (~ 1000 строк, вставленных в начале каждого месяца), и моя единственная задача - обеспечить уникальность.
@RBarryYoung, у меня пока нет представителя, чтобы комментировать, но у меня были проблемы с решением HASHBYTES, потому что один из моих типов данных был datetime, и я совершил ошибку новичка (?), Не предоставив необязательный аргумент стиля для моего Функция CONVERT при конвертации в varchar. Без стиля вы получаете следующую ошибку при попытке добавить
PERSISTED UNIQUE NONCLUSTERED
ограничения:источник
Вы можете объединить некоторые значения, чтобы создать новое уникальное значение и сохранить его в дополнение к текущим данным.
Создайте пользовательскую функцию для создания новых значений и триггер для заполнения поля при добавлении данных, тогда у вас не будет гораздо больше накладных расходов при обслуживании поля.
Комбинация двух или трех ваших полей даст вам ограничение до 16.
источник
Вы можете пойти с триггером для
insert
/update
. Сделайте выборку по столбцам с предложениемhaving count(*) > 1
. Если это возвращается не пустой, откат.источник
Вот что я бы сделал. Я бы создал триггер AFTER для INSERT, UPDATE, который выполняет
ROW_NUMBER ()
функцию, и разделов на все 18 ваших уникальных столбцов. Если максимальный номер строки больше единицы, выполните aROLLBACK
.источник