2011-01-17 20 views
4

Ich habe einen gebrochenen Fremdschlüssel in SQL Server 2005. Hier ist eine Reproduktion:Fixing Fremdschlüssel mit ALTER TABLE gebrochen ... WITH CHECK CHECK CONSTRAINT

CREATE TABLE t2(i2 BIGINT NOT NULL PRIMARY KEY) 
CREATE TABLE t1(i1 BIGINT NOT NULL PRIMARY KEY) 

ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (i1) REFERENCES t2 (i2) 
ALTER TABLE t1 NOCHECK CONSTRAINT fk 

INSERT INTO t1 (i1) VALUES (0) 

Wenn ich später ausführen:

ALTER TABLE t1 WITH CHECK CHECK CONSTRAINT fk 

ich den Fehler:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "fk". The conflict occurred in database "broken-fk", table "dbo.t2", column 'i2'.

ich dies manuell beheben:

DELETE FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t2.i2 = t1.i1) 
ALTER TABLE t1 WITH CHECK CHECK CONSTRAINT fk 

aber ich würde es vorziehen, es in einem Schritt zu tun, da jeder vermutlich einen Tabellenscan benötigt und die Tabelle zehn Gigabyte groß ist.

Ist es möglich, die ALTER TABLE zu erhalten, um den Fehler zu beheben (durch das Löschen von Zeilen) anstatt mit einem Fehler zu beenden?

Danke.

Antwort

4

Is it possible to get the ALTER TABLE to fix the error (by dropping rows) rather than exiting with an error?

Die lange und kurze - nein. Führen Sie es in zwei Schritten aus, wie Sie es kennen.

könnten Sie bei

ALTER TABLE t1 CHECK CONSTRAINT fk 

stoppen, die es für neue Datensätze einschaltet lässt aber die vorhandenen Daten allein?

+0

Nicht die Antwort, auf die ich gehofft hatte, aber danke. :) –

+3

Ein Wort der Warnung bezüglich, was cyberwiki sagte. Verwenden Sie im Allgemeinen nicht "ALTER TABLE t1 CHECK CONSTRAINT fk". Verwenden Sie immer ALTER TABLE t1 ** MIT CHECK ** CHECK CONSTRAINT fk, sofern Sie die Einschränkung nicht sofort wieder deaktivieren und wieder aktivieren möchten. WITH CHECK macht einen großen Unterschied, weil ohne sie die Einschränkung als "nicht vertrauenswürdig" markiert wird. Das bedeutet, dass das Optimierungsprogramm es ignoriert und einige andere Funktionen möglicherweise beeinträchtigt oder deaktiviert sind (einige Ansichtsupdates funktionieren möglicherweise nicht). – sqlvogel

+0

@dportas - wenn Sie der Frage folgen und die nächste Anweisung "bestehende Daten allein lassen", werden Sie sehen, warum WITH CHECK nicht funktioniert – RichardTheKiwi