2012-09-29 10 views
11

ich zum Beispiel bedeuten, kann ich Tabelle erstellen, wieUnterschiede zwischen „Fremdschlüssel“ und „Zwang Fremdschlüssel“

create table XTable 
( 
    idt int not null primary key, 
    value nvarchar(50), 
    idq int, 
    constraint fk_idq foreign key(idq) references YTable(idq) 
) 

und ich kann es wie dieses

create table XTable 
(
    idt int not null primary key, 
    value nvarchar(50), 
    idq int, 
    foreign key(idq) references YTable(idq) 
) 

erstelle ich in der Regel Tabelle erstellen wie im zweiten Beispiel bin ich jetzt aber neugierig auf das erste Beispiel. Was ist der Unterschied?

Antwort

9

Die erste Option dient lediglich dazu, die Einschränkung zu benennen.

Von SQL FOREIGN KEY Constraint

Zur Benennung einer FOREIGN KEY-Einschränkung zu erlauben und eine FOREIGN KEY-Einschränkung auf mehrere Spalten zu definieren, verwenden Sie die folgende SQL-Syntax

CREATE TABLE Orders 
(
O_Id int NOT NULL, 
OrderNo int NOT NULL, 
P_Id int, 
PRIMARY KEY (O_Id), 
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) 
REFERENCES Persons(P_Id) 
) 

Auch aus CREATE TABLE (Transact-SQL) man sehen kann, dass [ CONSTRAINT constraint_name ] ist optional.

+0

Noob-Frage: Welche Vorteile bietet die Benennung der Constraint? –

9

Die erste weist dem Fremdschlüssel einen benutzerdefinierten Namen zu, die zweite weist dem Fremdschlüssel einen vom System generierten Namen zu.

ALTER TABLE XTable DROP CONSTRAINT fk_idq; 
ALTER TABLE XTable ENABLE CONSTRAINT fk_idq; 
ALTER TABLE XTable DISABLE CONSTRAINT fk_idq; 

Es ist schwieriger zu verändern Einschränkungen mit vom System generierten Namen, als Sie zum ersten Mal dieser Namen zu entdecken haben:

Benutzerdefinierte Fremdschlüssel Namen können für nachfolgende Aussagen wie diese nützlich sein.

+0

Also die einzige Verwendung von 'CONSTRAINT' ist, einen einfacheren Weg zu' DROP', 'ENABLE' oder' DISABLE' zu haben. Ist es empfehlenswert, alle * Einschränkungen zu nennen? – displayname

+0

@StefanFalk: Ich würde * immer * explizit alle Objekte in der Datenbank benennen, da ich nur bedauert habe, wenn Dinge nicht auf diese Weise gemacht wurden, später, wenn ein Projekt in Wartung geht. In der Tat ist es sinnvoll, ein Benennungsschema zu definieren, bei dem Constraints visuell einfach mit ihrem Namen mit ihren Tabellen verknüpft werden können. Sieht in der Tat wie ein guter Blog-Beitrag aus. –

+0

Das macht Sinn. Mein Benennungsschema für Fremdschlüssel lautet 'fk__referencing_tabellenname__referenced_tabellenname', was manchmal ziemlich große Namen hervorbringt. :) – displayname

3

Abgesehen von der Kontrolle des Namens, nichts wirklich. SQL Server wird einen Namen angeben, wenn Sie es weglassen. FYI, müssen Sie nur diese Syntax (SQL Fiddle):

create table XTable 
(
    idt int not null primary key, 
    value nvarchar(50), 
    idq int references YTable(idq) 
) 

hier ein fuller example.