Могу ли я установить ignore_dup_key для первичного ключа? - PullRequest
32 голосов
/ 07 апреля 2010

У меня есть первичный ключ из двух столбцов в таблице.Я попытался изменить его, чтобы включить ignore_dup_key этой командой:

ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);

Но я получаю эту ошибку:

Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.

Как ещея должен установить IGNORE_DUP_KEY на?

Ответы [ 5 ]

57 голосов
/ 26 июня 2012
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
22 голосов
/ 07 апреля 2010

Это не задокументировано в Books Online, но я обнаружил, что, хотя это действительно для первичных ключей, вы не можете изменить это с помощью ALTER INDEX, вам придется удалить и заново создать первичный ключ.

Имейте в виду, что этот флаг не позволяет вам фактически хранить дублирующиеся строки, он просто изменяет ошибку, которая приводит к:

ON
A warning message will occur when duplicate key values are inserted into a unique
index. Only the rows violating the uniqueness constraint will fail.

OFF
An error message will occur when duplicate key values are inserted into a 
unique index. The entire INSERT operation will be rolled back.

С http://msdn.microsoft.com/en-us/library/ms175132.aspx

4 голосов
/ 07 апреля 2010

Определяет, что происходит, когда вы вставляете только дубликаты

См. ALTER TABLE..индексная опция

Определяет реакцию на ошибку, когда операция вставки пытается вставить дублировать ключевые значения в уникальный индекс. Параметр IGNORE_DUP_KEY применяется только к операциям вставки после того, как индекс создан или перестроен. Опция не действует, когда выполнение CREATE INDEX, ALTER INDEX, или ОБНОВЛЕНИЕ.

.. и это не относится к ПК

Комментарий BOL для ALTER TABLE об этом и "обратной совместимости" несколько сбивает с толку. Я только что попробовал, и BradC правильно.

CREATE TABLE dbo.foo (bar int PRIMARY KEY WITH (FILLFACTOR=90, IGNORE_DUP_KEY = ON))
GO
INSERT dbo.foo VALUES (1)
GO
INSERT dbo.foo VALUES (1)
GO
--gives    
(1 row(s) affected)

Duplicate key was ignored.

(0 row(s) affected)
0 голосов
/ 07 апреля 2010

Лично я никогда не хочу игнорировать дубликат.Если в первичном ключе есть повторяющееся значение, его необходимо исправить.Я не хочу, чтобы это игнорировалось и вставлялись другие записи, потому что тогда пользователь мог бы подумать, что они все были вставлены.Этот параметр скрывает неверный процесс вставки.Хорошо разработанный процесс не нуждается в этом параметре, так как он очищает данные перед вводом (или использует upsert для обновления существующих и вставки новых) и отправляет неверные записи в таблицу, чтобы их можно было исправить и заново вставить, или отправляет ошибкуобратно к пользователю, чтобы они знали, что их запись не была вставлена.

0 голосов
/ 07 апреля 2010

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

Если вы пытаетесь вставить дубликаты ключей, вы можете удалить индекс первичного ключа, вставить записи, исправить данные (удалить дубликаты и т. Д.), А затем заново создать индекс.

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