sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo crear una clave externa en SQL Server (ejemplos de T-SQL)

En este artículo, demuestro cómo crear una clave externa en SQL Server utilizando Transact-SQL. Demuestro cómo crear una clave externa al momento de crear la tabla (en lugar de actualizar una tabla existente).

Una clave externa es una columna que hace referencia a la columna de clave principal de otra tabla. Esto crea una relación entre las tablas.

Ejemplo 1 – Preparación

En este ejemplo, crearé una base de datos de prueba con una tabla. Esta tabla contendrá la clave principal a la que hará referencia nuestra clave externa.

Crear la base de datos:

CREATE DATABASE FK_Test;

Ahora cree la tabla de clave principal:

USE FK_Test;

CREATE TABLE Country
(
    CountryId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    CountryName nvarchar(60)
);

Ejemplo 2:crear la clave externa

Ahora que tenemos una tabla con una clave principal, creemos otra tabla con una clave externa que haga referencia a esa clave principal.

CREATE TABLE City
(
    CityId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    CountryId int NOT NULL REFERENCES Country(CountryId),
    CityName nvarchar(60)
);

Esta es la forma más sencilla de crear una clave externa. Todo lo que hacemos es agregar las REFERENCES cláusula (junto con la tabla y la columna de clave principal) a la columna que tendrá la restricción de clave externa.

Para ser claros, la parte que define la clave externa es esta:

REFERENCES Country(CountryId)

Esto se incluye en la definición de la columna y simplemente indica que esta columna hará referencia al CountryId columna en el Country mesa.

En este caso, tanto la clave externa como la clave principal a la que hace referencia comparten el mismo nombre (CountryId ). Sin embargo, esto no es un requisito:su columna de clave externa puede tener un nombre completamente diferente a la columna a la que hace referencia (aunque todas las columnas que participan en una relación de clave externa deben definirse con la misma longitud y escala).

Este ejemplo hace que SQL Server genere automáticamente el nombre de la clave externa. Eso es porque no proporcioné un nombre. Siga leyendo para ver cómo puede crear un nombre para su clave externa.

Pero primero, verifiquemos la restricción de clave externa que acabamos de crear.

Ejemplo 3:verificar la restricción de clave externa

Hay muchas formas de devolver una clave externa usando T-SQL, y esta es una de ellas:

EXEC sp_fkeys @fktable_name = City;

Resultado (usando salida vertical):

PKTABLE_QUALIFIER | FK_Test
PKTABLE_OWNER     | dbo
PKTABLE_NAME      | Country
PKCOLUMN_NAME     | CountryId
FKTABLE_QUALIFIER | FK_Test
FKTABLE_OWNER     | dbo
FKTABLE_NAME      | City
FKCOLUMN_NAME     | CountryId
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK__City__CountryId__38996AB5
PK_NAME           | PK__Country__10D1609FC8BFA7F2
DEFERRABILITY     | 7

Las sp_fkeys El procedimiento almacenado del sistema devuelve información sobre nuestra clave externa, su clave principal asociada y otros detalles relevantes. Simplemente pasa el nombre de la tabla de clave externa o la tabla de clave principal, y devolverá la información relevante.

En este ejemplo, paso el nombre de la tabla de claves foráneas:City . En los resultados, podemos ver el FK_NAME columna para ver que esta tabla tiene una restricción de clave externa llamada FK__City__CountryId__38996AB5 . Este es el que acabamos de crear.

Entonces, ahora que hemos creado la clave externa, siempre que intentemos insertar o actualizar un valor en City.CountryId columna, la restricción de clave externa solo lo permitirá si el mismo valor ya existe en el Country.CountryId columna. Esto asegura que se mantenga la integridad referencial dentro de la base de datos.

Ejemplo 4:más opciones

Es posible agregar más opciones a su definición de clave externa.

Por ejemplo, puede proporcionar un nombre para la clave externa. También puede especificar qué debe ocurrir con los valores de esta columna si el valor correspondiente de la clave principal se actualiza o elimina.

Aquí, vuelvo a crear ambas tablas, pero esta vez especifico explícitamente estas opciones (hago lo mismo para las claves primarias):

CREATE TABLE Country
(
    CountryId int IDENTITY (1,1) NOT NULL,
      CONSTRAINT PK_Country_CountryId PRIMARY KEY CLUSTERED (CountryId),
    CountryName nvarchar(60)
);

CREATE TABLE City
(
    CityId int IDENTITY (1,1) NOT NULL,
      CONSTRAINT PK_City_CityId PRIMARY KEY CLUSTERED (CityId),
    CountryId int NOT NULL,
      CONSTRAINT FK_City_Country FOREIGN KEY (CountryID)
        REFERENCES Country (CountryID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CityName nvarchar(60)
);

En este caso, la definición de clave externa comienza con CONSTRAINT , seguido del nombre de la clave foránea, seguido de FOREIGN KEY , seguida de la columna a la que se aplicará la restricción de clave externa (insertada entre paréntesis).

Luego vemos las mismas REFERENCES cláusula que vimos en el ejemplo anterior.

El ON DELETE CASCADE y ON UPDATE CASCADE Las cláusulas se utilizan para garantizar que los cambios realizados en Country la tabla se propagan automáticamente a la City mesa. Por ejemplo, si se elimina una fila de la tabla principal (clave principal), las filas correspondientes se eliminan de la tabla de referencia (clave externa).

El valor predeterminado para ON DELETE y ON UPDATE es NO ACTION . En este caso, el Motor de base de datos genera un error y se revierte la acción de actualización o eliminación en la fila de la tabla principal.

También puede usar SET NULL para establecer la columna de clave externa en NULL (requiere que la columna de clave externa sea anulable), o SET DEFAULT para establecerlo en su valor predeterminado (requiere que la columna de clave externa tenga una definición predeterminada. Si una columna es anulable y no hay un valor predeterminado explícito establecido, NULL se convierte en el valor predeterminado implícito de la columna).

En este ejemplo también aproveché para nombrar las claves primarias. Puede ver que la sintaxis de la clave principal es similar a la sintaxis de la clave externa, pero sin las REFERENCES (y con una cláusula CLUSTERED añadida argumento, que es el predeterminado para las claves principales).

Ahora comprueba la clave foránea:

EXEC sp_fkeys @fktable_name = City;

Resultado:

PKTABLE_QUALIFIER | FK_Test
PKTABLE_OWNER     | dbo
PKTABLE_NAME      | Country
PKCOLUMN_NAME     | CountryId
FKTABLE_QUALIFIER | FK_Test
FKTABLE_OWNER     | dbo
FKTABLE_NAME      | City
FKCOLUMN_NAME     | CountryId
KEY_SEQ           | 1
UPDATE_RULE       | 0
DELETE_RULE       | 0
FK_NAME           | FK_City_Country
PK_NAME           | PK_Country_CountryId
DEFERRABILITY     | 7

Podemos ver que el nombre de la clave externa ahora es FK_City_Country y la restricción de clave principal de la columna a la que hace referencia se llama PK_Country_CountryId .

Ejemplo 5:clave externa en varias columnas

También puede crear una clave externa en varias columnas que haga referencia a una clave principal de varias columnas. Las claves primarias de varias columnas también se conocen como claves primarias compuestas. Para crear una clave foránea compuesta, simplemente separe las columnas con una coma al definir la clave.

Así:

CONSTRAINT FK_FKName FOREIGN KEY
 (FKColumn1, FKColumn2)
REFERENCES PrimaryKeyTable (PKColumn1, PKColumn2)

Consulte Cómo crear una clave externa compuesta en SQL Server para obtener un ejemplo más detallado.

¿Es realmente necesaria la clave principal?

Una clave principal no es absolutamente necesaria para las claves externas, ya que podría usar una restricción única o un índice único. Específicamente, la documentación de Microsoft establece esto:

FOREIGN KEY las restricciones solo pueden hacer referencia a columnas en PRIMARY KEY o UNIQUE restricciones en la tabla referenciada o en un UNIQUE INDEX en la tabla de referencia.

Por lo tanto, si bien suele ser una buena práctica tener claves principales en todas las tablas, sus claves externas no están obligadas a hacer referencia a ellas.