web-dev-qa-db-fra.com

Puis-je définir ignore_dup_key pour une clé primaire?

J'ai une clé primaire à deux colonnes sur une table. J'ai essayé de le modifier pour activer le ignore_dup_key avec cette commande:

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

Mais je reçois cette erreur:

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

Sinon, comment dois-je définir IGNORE_DUP_KEY sur?

30
Mr. Flibble

Ce n'est pas documenté dans la documentation en ligne, mais j'ai constaté que bien que cela soit valable pour les clés primaires, vous ne pouvez pas le modifier avec un ALTER INDEX, vous devrez supprimer et recréer la clé primaire.

Gardez à l'esprit que cet indicateur ne vous permet pas de stocker des lignes en double, il modifie simplement l'erreur qui en résulte:

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.

De http://msdn.Microsoft.com/en-us/library/ms175132.aspx

22
BradC
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
53
Kvasi

Il détermine ce qui se passe lorsque vous insérez des doublons uniquement

Voir ALTER TABLE..index option

Spécifie la réponse d'erreur quand un L'opération d'insertion tente d'insérer dupliquer les valeurs de clé dans un unique indice. L'option IGNORE_DUP_KEY s'applique uniquement aux opérations d'insertion après la création ou la reconstruction de l'index . L'option n'a aucun effet lorsque exécuter CREATE INDEX, ALTER INDEX, ou UPDATE.

..et cela ne s'applique pas aux PC

Le commentaire de BOL pour ALTER TABLE à ce sujet et sur la "compatibilité ascendante" est quelque peu déroutant. Je viens d'essayer et BradC est correct.

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

Personnellement, je ne veux jamais qu'il ignore le doublon. S'il existe une valeur en double dans une clé primaire, elle doit être corrigée. Je ne veux pas qu'il soit ignoré et que les autres enregistrements soient insérés, car l'utilisateur pourrait penser qu'ils ont tous été insérés. Ce paramètre est une dissimulation pour un processus d'insertion incorrect. Un processus bien conçu n'a pas besoin de ce paramètre car il nettoie les données avant de les entrer (ou utilise upsert pour mettre à jour les existants et en insérer de nouveaux) et envoie les enregistrements incorrects à une table afin qu'ils puissent être corrigés et réinsérés ou envoie une erreur. de nouveau à l'utilisateur, afin qu'il sache que son enregistrement n'a pas été inséré. 

0
HLGEM

Notez que ce paramètre n'affecte que ce qui se passe si vous essayez d'insérer une clé dupliquée. Il ne vous permet pas d'insérer une clé dupliquée.

Si vous essayez d'insérer des clés en double, vous pouvez supprimer l'index de clé primaire, insérer vos enregistrements, corriger les données (supprimer les doublons, etc.), puis recréer l'index.

0
Marcus Adams