sql >> Base de Datos >  >> RDS >> Database

Crear una relación en SQL

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 en NULL 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.