У меня есть стол, и почему-то один и тот же человек Person
дважды садился за мой стол. Прямо сейчас, первичный ключ - это просто число, но существуют два других поля, которые я хочу заставить быть уникальными.
Например, поля:
ID
Name
Active
PersonNumber
Я хочу только 1 запись с уникальным PersonNumber и Active = 1.
(поэтому комбинация двух полей должна быть уникальной)
Что является лучшим способом для существующей таблицы на сервере SQL, я могу сделать так, чтобы, если кто-либо другой сделал вставку с тем же значением, что и существующее значение, произошел сбой, поэтому мне не нужно беспокоиться об этом в коде моего приложения.
sql
sql-server
Лиора
источник
источник
Ответы:
Как только вы удалили свои дубликаты:
или
Конечно, часто лучше сначала проверить это нарушение, прежде чем просто позволить SQL Server попытаться вставить строку и вернуть исключение (исключения дорогие).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Если вы хотите предотвратить всплытие исключений в приложение, не внося изменений в приложение, вы можете использовать
INSTEAD OF
триггер:Но если вы не скажете пользователю, что он не выполнил вставку, он задастся вопросом, почему данных нет, и об исключениях не сообщалось.
EDIT - это пример, который делает именно то, что вы просите, даже используя те же имена, что и ваш вопрос, и доказывает это. Вы должны попробовать это прежде, чем предположить, что вышеупомянутые идеи рассматривают только один столбец или другой, в отличие от комбинации ...
Данные в таблице после всего этого:
Сообщение об ошибке на последней вставке:
источник
Это также можно сделать в графическом интерфейсе:
источник
new Index
не кликабелен, он отключен :(В моем случае мне нужно было разрешить много неактивных и активную только одну комбинацию из двух ключей, например:
Это похоже на работу:
Вот мои тесты:
источник
И если у вас есть много запросов на вставку, но вы не хотите каждый раз получать сообщение об ошибке, вы можете сделать это:
источник