2012-09-29 36 views
11

Me refiero, por ejemplo, puedo crear tabla comodiferencias entre "clave externa" y "restricción de clave externa"

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

y puedo crearla como esto

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

Por lo general crear mesa como en el segundo ejemplo, pero ahora tengo curiosidad sobre el primer ejemplo. ¿Cuál es la diferencia?

Respuesta

9

La primera opción es puramente para nombrar la restricción.

De SQL FOREIGN KEY Constraint

Para permitir la designación de una restricción FOREIGN KEY, y para definir una restricción FOREIGN KEY en varias columnas, utilice la siguiente sintaxis SQL

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) 
) 

Asimismo, desde CREATE TABLE (Transact-SQL) se puede ver que [ CONSTRAINT constraint_name ] es opcional.

+0

Pregunta de Noob: ¿qué ventajas ofrece nombrar la restricción? –

9

El primero asigna un nombre definido por el usuario a la clave externa, el segundo asigna un nombre generado por el sistema a la clave externa.

nombres de claves externas definidas por el usuario pueden ser útiles para posteriores declaraciones como éstas:

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

Es más difícil de alterar las limitaciones con nombres generados por el sistema, ya que tienes que descubrir esos nombres en primer lugar.

+0

Entonces, ¿el único uso de 'CONSTRAINT' es tener una manera más fácil de 'DROP',' ENABLE' o 'DISABLE' una restricción? ¿Se recomienda nombrar * todas las restricciones? – displayname

+0

@StefanFalk: Me gustaría * siempre * nombrar explícitamente todos los objetos en la base de datos ya que solo he visto arrepentimientos cuando las cosas no se han hecho de esta manera, más adelante cuando un proyecto entra en mantenimiento. De hecho, es aconsejable definir un esquema de nombres donde las restricciones se puedan asociar visualmente con sus tablas fácilmente por su nombre. Parece un buen tema de publicación de blog, de hecho. –

+0

Esto tiene sentido. Mi esquema de denominación para claves foráneas es 'fk__referencing_table_name__referenced_table_name' que desafortunadamente produce nombres bastante grandes a veces. :) – displayname

3

Además de controlar el nombre, nada realmente. SQL Server proporcionará un nombre si lo omite. Para su información, sólo es necesario (SQL Fiddle) esta sintaxis:

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

Aquí hay una fuller example.

Cuestiones relacionadas