Я могу установить 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 к на?

35
задан gotqn 3 May 2017 в 06:35
поделиться

4 ответа

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

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

25
ответ дан 27 November 2019 в 06:42
поделиться

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

0
ответ дан 27 November 2019 в 06:42
поделиться

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

См. ALTER TABLE..index option

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

.. и это не относится к PK.

Комментарий 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
ответ дан 27 November 2019 в 06:42
поделиться

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

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

0
ответ дан 27 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: