2010-05-28 6 views
18

Wenn Sie eine Fremdschlüsseleinschränkung in einer Tabelle erstellen und das Skript in MS SQL Management Studio erstellen, sieht es folgendermaßen aus.T-SQL-Fremdschlüsselüberprüfung-Einschränkung

ALTER TABLE T1 WITH CHECK ADD CONSTRAINT FK_T1 FOREIGN KEY(project_id) 
REFERENCES T2 (project_id) 
GO 
ALTER TABLE T1 CHECK CONSTRAINT FK_T1 
GO 

Was ich nicht verstehe, ist, welchen Zweck hat die zweite mit Check-Bedingung ändern. Erstellt die FK-Einschränkung nicht genug? Müssen Sie die Prüfbedingung hinzufügen, um die Referenzintegrität sicherzustellen?

Eine andere Frage: Wie würde es dann aussehen, wenn Sie es direkt in der Spaltendefinition schreiben würden?

CREATE TABLE T1 (
my_column INT NOT NULL CONSTRAINT FK_T1 REFERENCES T2(my_column) 
) 

Ist das nicht genug?

Antwort

8

Zuerst erstellt es die Einschränkung und hier können Sie angeben, ob Daten bereits in der Tabelle gegen Ihre neue Einschränkung überprüft werden sollen oder nicht. WITH { CHECK | NOCHECK }

Der zweite Teil gibt an, dass die Einschränkung aktiviert ist. ALTER TABLE TableName { CHECK | NOCHECK } CONSTRAINT ConstraintName

+5

ok .. und es wird nicht standardmäßig aktiviert? Weil meiner Meinung nach .. wenn ich eine Einschränkung beim Erstellen einer Tabelle schreibe sollte es standardmäßig aktiviert sein. –

+0

Ich möchte eine Antwort für Ihre zweite Frage erhalten, die gesamte Dokumentation, die ich lese, sagt, dass fk constraint die Regel in vorhandenen Spalten standardmäßig erzwingen wird, so würde ich glauben, dass die zweite Aussage unnötig ist. – Ernesto

3

Die zweite Anweisung wird von der "WITH CHECK" in der ersten Anweisung gezwungen. Es gibt eine Einstellung, die Sie umschalten können, um dies nicht zu tun.