En SQL, crea una relación creando una restricción de clave externa.
Más específicamente, tiene una tabla principal y una tabla secundaria. La tabla principal contiene la clave principal y la tabla secundaria contiene una clave externa que hace referencia a la clave principal de la tabla principal.
Cuando usa SQL para crear una relación, puede crear la relación en el momento en que crea la tabla, o puede crearla más tarde (modificando la tabla). Este artículo cubre ambos escenarios.
Cree una relación al crear la tabla
Aquí hay un ejemplo de cómo crear una relación dentro de su CREATE TABLE
declaración en el momento de crear la tabla.
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Aquí creé dos tablas; uno llamado Parent
y el otro llamado Child
.
Creé la relación dentro de la definición de tabla para niño. La relación se crea con la CONSTRAINT
argumento. Tenga en cuenta que esto todavía está dentro de CREATE TABLE
declaración.
La relación necesita un nombre. En este caso lo llamé FK_Child_Parent
. La FOREIGN KEY
parte va seguida del nombre de la columna (en la tabla secundaria) que será la clave externa.
Las REFERENCES
part especifica la columna a la que hará referencia la clave externa. En este caso, hace referencia al ParentId
columna del Parent
mesa. Esto se hace usando REFERENCES Parent (ParentId)
.
Eso es todo lo que se requiere para crear la relación.
Tenga en cuenta que los ejemplos de esta página se realizaron con SQL Server. Dependiendo de su DBMS, es posible que deba cambiar algunos detalles de las definiciones de columna.
Por ejemplo IDENTITY
es la versión de SQL Server de lo que a veces se llama AUTO_INCREMENT
en otros DBMS (como MySQL). Si usa SQLite, aquí le mostramos cómo crear una columna de incremento automático en SQLite.
Agregar una relación a una tabla existente
También puede agregar una relación a una tabla existente, simplemente usando ALTER TABLE
declaración.
Supongamos que no creamos la relación al crear las dos tablas del ejemplo anterior. Así que supongamos que hicimos esto en su lugar:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
Entonces, en este escenario, todo lo que hicimos fue crear dos tablas. No se creó ninguna relación entre ellos.
Ahora, después de crear las tablas, de repente recordamos "¡Oh, maldita sea, olvidé crear una relación!".
No hay problema, ahora podemos hacer esto:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Hecho. Acabamos de agregar la relación usando los mismos detalles que en el ejemplo anterior.
Tenga en cuenta que SQLite no admite la adición de claves foráneas con ALTER TABLE
declaración. Consulte cómo agregar una clave externa a una tabla existente en SQLite para obtener más información al respecto.
Al actualizar/eliminar
De forma predeterminada, las relaciones de SQL Server se crean utilizando ON DELETE NO ACTION
y ON UPDATE NO ACTION
. Por lo tanto, los ejemplos anteriores se crearon con esta configuración.
Sin embargo, diferentes DBMS pueden usar otras configuraciones predeterminadas.
De cualquier manera, puede especificar esto explícitamente en su código. Así que podemos modificar el ejemplo anterior para que se vea así:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Lo que esto realmente significa es que, si alguien intentara eliminar o actualizar un registro en la clave principal, se produciría un error y el cambio se revertiría. Esta es la forma que tiene SQL Server de evitar cualquier cambio que pueda romper la integridad referencial de su sistema.
Básicamente, la razón por la que creas una relación en primer lugar es para hacer cumplir la integridad referencial.
Sin embargo, tiene algunas opciones sobre cómo desea que SQL Server se ocupe de estas situaciones.
Específicamente, puede usar cualquiera de los siguientes valores:
NO ACTION
:se genera un error y se revierte la acción de eliminar/actualizar en la fila de la tabla principal.CASCADE
:las filas correspondientes se eliminan/actualizan en la tabla de referencia si esa fila se elimina/actualiza en la tabla principal.SET NULL
:Todos los valores que componen la clave foránea se establecen enNULL
si la fila correspondiente en la tabla principal se elimina o actualiza. Esto requiere que las columnas de clave foránea sean anulables.SET DEFAULT
:todos los valores que componen la clave externa se establecen en sus valores predeterminados si se elimina o actualiza la fila correspondiente en la tabla principal. Para que se ejecute esta restricción, todas las columnas de clave externa deben tener definiciones predeterminadas. Si una columna admite valores NULL y no hay un valor predeterminado explícito establecido,NULL
se convierte en el valor predeterminado implícito de la columna.