Подтвердить что ты не робот

Могу ли я установить ignore_dup_key для первичного ключа?

У меня есть двухколоночный первичный ключ в таблице. Я попытался изменить его, чтобы установить 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 на?

4b9b3361

Ответ 1

Он не документирован в 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

Ответ 2

ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)

Ответ 3

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

См. 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)

Ответ 4

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

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

Ответ 5

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