wake-up-neo.net

Kann ich ignore_dup_key für einen Primärschlüssel aktivieren?

Ich habe einen zweispaltigen Primärschlüssel in einer Tabelle. Ich habe versucht, es zu ändern, um den ignore_dup_key mit diesem Befehl zu aktivieren:

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

Aber ich bekomme diesen Fehler:

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

Wie soll ich sonst IGNORE_DUP_KEY einschalten?

30
Mr. Flibble

Es ist nicht in der Onlinedokumentation dokumentiert, aber ich habe festgestellt, dass dies zwar für Primärschlüssel gilt, Sie können dies jedoch nicht mit einem ALTER INDEX ändern. Sie müssen den Primärschlüssel löschen und neu erstellen.

Beachten Sie, dass Sie mit diesem Flag keine doppelten Zeilen speichern können. Es ändert lediglich den Fehler, der sich ergibt:

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.

Von http://msdn.Microsoft.com/de-de/library/ms175132.aspx

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

Sie bestimmt, was passiert, wenn Sie nur Duplikate einfügen

Siehe ALTER TABLE..index Option

Gibt die Fehlerantwort an, wenn ein Einfügeoperation versucht Einfügen von Schlüsselwerte in ein eindeutiges Index. Die Option IGNORE_DUP_KEY gilt nur für Einfügeoperationen nachdem der Index erstellt oder neu erstellt wurde . Die Option hat keine Wirkung, wenn Ausführen von CREATE INDEX, ALTER INDEX, oder UPDATE.

..und es gilt nicht für PKs

Der BOL-Kommentar für ALTER TABLE zu diesem Thema und "Rückwärtskompatibilität" ist etwas verwirrend. Ich habe es gerade ausprobiert und BradC ist richtig.

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

Ich persönlich möchte nie, dass das Duplikat ignoriert wird. Wenn es einen doppelten Wert für einen Primärschlüssel gibt, muss dieser korrigiert werden. Ich möchte nicht, dass es ignoriert wird und die anderen Datensätze eingefügt werden, da der Benutzer möglicherweise der Meinung ist, dass alle eingefügt wurden. Diese Einstellung ist ein Vertuschungsvorgang für einen fehlerhaften Einfügevorgang. Ein gut konzipierter Prozess benötigt diese Einstellung nicht, da die Daten vor der Eingabe bereinigt werden (oder Upsert zum Aktualisieren vorhandener und Einfügen neuer verwendet wird) und die fehlerhaften Datensätze an eine Tabelle gesendet werden, damit sie repariert und erneut eingefügt werden können oder einen Fehler sendet an den Benutzer zurück, damit sie wissen, dass der Datensatz nicht eingefügt wurde. 

0
HLGEM

Beachten Sie, dass diese Einstellung nur Auswirkungen darauf hat, was passiert, wenn Sie versuchen, einen doppelten Schlüssel einzufügen. Sie können jedoch keinen doppelten Schlüssel einfügen.

Wenn Sie versuchen, doppelte Schlüssel einzufügen, können Sie den Primärschlüsselindex löschen, Ihre Datensätze einfügen, die Daten korrigieren (Duplikate entfernen usw.) und dann den Index neu erstellen.

0
Marcus Adams