Antworten:
Auf der MSDN-Dokumentationsseite zu wird Folgendes ALTER TABLEerläutert:
ALTER TABLE: Ändere die Struktur der Tabelle CHECK CONSTRAINT ..: Aktivieren Sie die EinschränkungNOCHECK CONSTRAINT ..: Deaktivieren der Einschränkung WITH CHECK: Überprüfen Sie auch die EinschränkungWITH NOCHECK: überprüfen Sie die Einschränkung nichtIn ihren Worten:
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [ ,...n ] }...
WITH CHECK | WITH NOCHECKGibt an, ob die Daten in der Tabelle ist oder validiert wird , nicht gegen eine neu hinzugefügte oder neu aktiviertFOREIGN KEYoderCHECKEinschränkung . Wenn nicht angegeben,WITH CHECKwird dies für neue Einschränkungen undWITH NOCHECKfür wieder aktivierte Einschränkungen angenommen.Wenn Sie keine neuen Daten
CHECKoderFOREIGN KEYEinschränkungen für vorhandene Daten überprüfen möchten , verwenden SieWITH NOCHECK. Dies wird nur in seltenen Fällen empfohlen. Die neue Einschränkung wird bei allen späteren Datenaktualisierungen ausgewertet. Verstöße gegen Einschränkungen, dieWITH NOCHECKbeim Hinzufügen der Einschränkung unterdrückt werden, können dazu führen, dass zukünftige Aktualisierungen fehlschlagen, wenn sie Zeilen mit Daten aktualisieren, die der Einschränkung nicht entsprechen.Das Abfrageoptimierungsprogramm berücksichtigt keine definierten Einschränkungen
WITH NOCHECK. Solche Einschränkungen werden ignoriert, bis sie mithilfe vonALTER TABLEtable wieder aktiviert werdenWITH CHECK CHECK CONSTRAINT ALL....
{ CHECK | NOCHECK } CONSTRAINT
Gibt an, dass Constraint-Name aktiviert oder deaktiviert ist. Diese Option kann nur mitFOREIGN KEYundCHECKEinschränkungen verwendet werden. WennNOCHECKangegeben, ist die Einschränkung deaktiviert und zukünftige Einfügungen oder Aktualisierungen der Spalte werden nicht anhand der Einschränkungsbedingungen überprüft.DEFAULT,PRIMARY KEYUndUNIQUEZwänge können nicht deaktiviert werden.
Test in DBFiddle :
CREATE TABLE a (aid INT PRIMARY KEY);GEHEN
✓
INSERT INTO a (aid) VALUES (1), (2), (3) ;GEHEN
3 Zeilen betroffen
CREATE TABLE b ( aid INT, bid INT PRIMARY KEY, CONSTRAINT [My_FORIEGN_KEY] FOREIGN KEY (aid) REFERENCES a (aid) ) ;GEHEN
✓
INSERT INTO b (aid, bid) VALUES (1, 11), (1, 12), (2, 21), (3, 31) ;GEHEN
4 Zeilen betroffen
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;GEHEN
Meldung 547 Stufe 16 Status 0 Zeile 1 Die INSERT-Anweisung ist mit der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY" in Konflikt geraten. Der Konflikt ist in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "aid" aufgetreten. Meldung 3621 Ebene 0 Status 0 Zeile 1 Die Anweisung wurde beendet.
SELECT * FROM b ;GEHEN
Hilfe bieten -: | -: 1 | 11 1 | 12 2 | 21 3 | 31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY]; --disableGEHEN
✓
INSERT INTO b (aid, bid) VALUES (4, 41), (4, 42) ;GEHEN
2 Zeilen betroffen
SELECT * FROM b ;GEHEN
Hilfe bieten -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking existing dataGEHEN
✓
SELECT * FROM b ;GEHEN
Hilfe bieten -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;GEHEN
Meldung 547 Stufe 16 Status 0 Zeile 1 Die INSERT-Anweisung ist mit der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY" in Konflikt geraten. Der Konflikt ist in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "aid" aufgetreten. Meldung 3621 Ebene 0 Status 0 Zeile 1 Die Anweisung wurde beendet.
SELECT * FROM b ;GEHEN
Hilfe bieten -: | -: 1 | 11 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- check existing data and enable constraintGEHEN
Meldung 547 Stufe 16 Status 0 Zeile 1 Die Anweisung ALTER TABLE widersprach der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY". Der Konflikt ist in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "aid" aufgetreten.
Lesen Sie den Artikel hier: https://msdn.microsoft.com/en-us/library/ms190273.aspx
Es sagt uns: 'Das Abfrageoptimierungsprogramm berücksichtigt keine Einschränkungen, die mit NOCHECK definiert wurden. Solche Einschränkungen werden ignoriert, bis sie mithilfe der Tabelle ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL wieder aktiviert werden.
Berücksichtigen Sie diesen Thread auch für StackOverflow: /programming/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking, bedeutet dies , dass die Beschränkung wird die bestehenden Daten nicht überprüfen, nur neu eingehende Daten?