SQL Server: clave externa establecida en nulo al eliminar

Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.

SQL Server: clave externa establecida en nulo al eliminar

Este tutorial de SQL Server describe cómo usar Clave externa con “establecer en nulo al eliminar” Sintaxis y ejemplos en SQL Server.

¿Cuál es la clave externa para “establecer NULL al eliminar” en SQL Server?

Una clave externa con “establecer nulo al eliminar” significa que si se elimina un registro en la tabla principal, el registro correspondiente en la tabla secundaria tiene el campo de clave externa establecido en NULL.Los registros en la tabla secundaria serán No Eliminado en SQL Server.

Las claves foráneas que se establecen en nulo en la eliminación se pueden crear mediante la instrucción CREATE TABLE o la instrucción ALTER TABLE.

Cree una clave externa y establezca nulo en la eliminación: use la declaración CREATE TABLE

sintaxis

La sintaxis para crear una clave externa y establecer un valor nulo en la eliminación mediante la instrucción CREATE TABLE en SQL Server (Transact-SQL) es:

CREATE TABLE child_table
(
  column1 datatype [ NULL | NOT NULL ],
  column2 datatype [ NULL | NOT NULL ],
  ...

  CONSTRAINT fk_name
    FOREIGN KEY (child_col1, child_col2, ... child_col_n)
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
    ON DELETE SET NULL
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
);

child_table El nombre de la tabla secundaria que desea crear. column1, column2 Las columnas que desea crear en la tabla. Cada columna debe tener un tipo de datos. La columna debe definirse como NULL o NOT NULL, si este valor se deja en blanco, la base de datos asume NULL como valor predeterminado. fk_name El nombre de la restricción de clave externa que desea crear. child_col1, child_col2, … child_col_n Columnas en child_table que harán referencia a la clave principal en parent_table. parent_table El nombre de la tabla principal cuya clave principal se usará en child_table. parent_col1, parent_col2, … parent_col3 Las columnas que componen la clave principal en parent_table. La clave foránea hará cumplir el vínculo entre estos datos y las columnas child_col1, child_col2, … child_col_n en child_table. ON DELETE SET NULL Especifica que los datos secundarios se establecen en NULL cuando se eliminan los datos principales. Los subdatos no se eliminarán. AL ACTUALIZAR Opcional. Especifica cómo manejar los datos secundarios cuando se actualizan los datos principales. Puede elegir SIN ACCIÓN, CASCADA, ESTABLECER NULO o ESTABLECER POR DEFECTO. SIN ACCIÓN Se utiliza junto con ON DELETE o ON UPDATE. Esto significa que cuando los datos principales se eliminan o actualizan, no se realiza ninguna acción en los datos secundarios. CASCADE se usa junto con ON DELETE o ON UPDATE. Esto significa que cuando los datos principales se eliminan o actualizan, los datos secundarios se eliminan o actualizan. SET NULL Se utiliza junto con ON DELETE o ON UPDATE. Esto significa que los datos secundarios se establecen en NULL cuando los datos principales se eliminan o actualizan. SET DEFAULT se usa junto con ON DELETE o ON UPDATE. Esto significa que cuando los datos principales se eliminan o actualizan, los datos secundarios se establecen en sus valores predeterminados.

ejemplo

Veamos un ejemplo de cómo usar la declaración CREATE TABLE para crear una clave externa en SQL Server (Transact-SQL) que se establece en nulo al eliminar.

Por ejemplo:

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE SET NULL
);

En este ejemplo de clave externa, creamos la tabla principal como la tabla de productos. La tabla de productos tiene una clave principal que consiste en el campo product_id.

A continuación, creamos una segunda tabla llamada inventario, que será la tabla secundaria en este ejemplo de clave externa. Creamos una clave externa denominada fk_inv_product_id en la tabla de inventario utilizando la instrucción CREATE TABLE. La clave externa establece una relación entre la columna product_id en la tabla de inventario y la columna product_id en la tabla de productos.

Para esta clave externa, especificamos la cláusula ON DELETE SET NULL, que le dice a SQL Server que establezca el registro correspondiente en la tabla secundaria en NULL al eliminar datos en la tabla principal. Entonces, en este ejemplo, si el valor de product_id se elimina de la tabla de productos, product_id se establece en NULL usando el registro correspondiente en la tabla de inventario para este product_id.

¡Ahora una cosa importante sobre la configuración de esta clave externa! ! ! Dado que la clave externa establecerá el campo product_id en NULL al eliminarlo en la tabla de inventario, debe asegurarse de que la columna product_id en la tabla secundaria esté configurada como una columna anulable. Si establece la columna en NOT NULL en la instrucción CREATE TABLE, recibirá el siguiente mensaje de error:

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE SET NULL
);

Msg 1761, Level 16, State 0, Line 1
Cannot create the foreign key "fk_inv_product_id" with the SET NULL referential action, because one or more referencing columns are not nullable.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.

Por lo tanto, asegúrese de definir su product_id en la tabla de inventario como un campo anulable, como se muestra a continuación, para que SQL Server pueda establecer la columna en NULL cuando se requiera una restricción de clave externa.

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE SET NULL
);

Command(s) completed successfully.

Cree una clave externa que se establezca en nulo al eliminar, utilizando la instrucción ALTER TABLE

sintaxis

La sintaxis para usar la instrucción ALTER TABLE en SQL Server (Transact-SQL) para crear una clave externa que se establece como nula al eliminarla es:

ALTER TABLE child_table
ADD CONSTRAINT fk_name
    FOREIGN KEY (child_col1, child_col2, ... child_col_n)
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
    ON DELETE SET NULL;

child_table El nombre de la tabla secundaria que desea modificar. fk_name El nombre de la restricción de clave externa que desea crear. child_col1, child_col2, … child_col_n Columnas en child_table que harán referencia a la clave principal en parent_table. parent_table El nombre de la tabla principal cuya clave principal se usará en child_table. parent_col1, parent_col2, … parent_col3 Las columnas que componen la clave principal en parent_table. La clave foránea hará cumplir el vínculo entre estos datos y las columnas child_col1, child_col2, … child_col_n en child_table. ON DELETE SET NULL Especifica que los datos secundarios se establecen en NULL cuando se eliminan los datos principales. Los subdatos no se eliminarán.

ejemplo

Veamos un ejemplo de cómo usar la declaración ALTER TABLE para crear una clave externa en SQL Server (Transact-SQL) que se establece en nulo al eliminar.

Por ejemplo:

ALTER TABLE inventory
ADD CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE SET NULL;

En este ejemplo de clave externa, hemos creado una clave externa en la tabla de inventario llamada fk_inv_product_id que hace referencia a la tabla de productos según el campo product_id.

Para esta clave externa, especificamos la cláusula ON DELETE SET NULL, que le dice a SQL Server que actualice los registros correspondientes en la tabla secundaria a NULL cuando se eliminan los datos en la tabla principal. Entonces, en este ejemplo, si el valor product_id se elimina de la tabla de productos, la columna product_id se establece en NULL en la tabla de inventario utilizando el registro correspondiente para este product_id.