web-dev-qa-db-ja.com

主キーに対してigno​​re_dup_keyをオンに設定できますか?

テーブルに2列の主キーがあります。次のコマンドで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をオンに設定する必要がありますか?

36
Mr. Flibble

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

25
BradC
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
60
Kvasi

重複のみを挿入するとどうなるかを決定します

ALTER TABLE..indexオプション を参照してください

挿入操作が重複するキー値を一意のインデックスに挿入しようとしたときのエラー応答を指定します。 IGNORE_DUP_KEYオプションは、インデックスが作成または再構築された後の挿入操作にのみ適用されます。このオプションは、CREATE INDEX、ALTER INDEX、またはUPDATEの実行時には影響を与えません。

..PKには適用されません

これと「後方互換性」に関するALTER TABLEのBOLコメントはやや混乱しています。私はそれを試してみましたが、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
gbn

個人的には、重複を無視したくありません。主キーに重複する値がある場合は、修正する必要があります。ユーザーがそれらすべてが挿入されたと思うかもしれないので、それを無視して他のレコードを挿入したくありません。この設定は、不適切な挿入プロセスの隠蔽です。適切に設計されたプロセスでは、データを入力する前にクリーンアップ(またはupsertを使用して既存のレコードを更新し、新しいレコードを挿入)するため、この設定は不要です。不良レコードをテーブルに送信して修正し、再挿入するか、エラーを送信します。彼らは彼らのレコードが挿入されなかったことを彼らが知っているので、ユーザーに戻って。

0
HLGEM

PKをドロップしてから再作成する

ALTER TABLE TableName DROP CONSTRAINT PK_TableName
GO
ALTER TABLE TableName ADD CONSTRAINT PK_TableName PRIMARY KEY CLUSTERED
( MyIDColumn ASC )
WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
GO

参照-> https://eitanblumin.com/2018/10/28/the-ignore_dup_key-option-in-primary-keys-and-unique-indexes/

0
Daniel C.

この設定は、重複キーを挿入しようとした場合にのみ影響することに注意してください。重複キーを挿入することはできません。

重複キーを挿入しようとしている場合は、主キーインデックスを削除し、レコードを挿入し、データを修正して(重複を削除するなど)、インデックスを再作成します。

0
Marcus Adams