Cómo crear restricciones de clave externa en SQL

Si es dueño de una empresa, debe haber encontrado el valor y la necesidad de datos en su negocio. Tener los medios para almacenar y manipular bases de datos agrega más valor al negocio.

Las bases de datos están organizadas en una convención particular y le permiten estructurar los datos en conexiones, lo que nos lleva a las bases de datos relacionales, que se adoptaron como una forma de gestión de datos desde la década de 1970. Y en el mercado actual, las bases de datos relacionales son las preferidas por sus capacidades a la hora de manipular datos.

Si bien hay muchas bases de datos relacionales disponibles, MySQL se ha convertido en el líder, clasificándose como el número dos del mundo, según Statista, a partir de enero de 2022.

En el servidor SQL, las restricciones son reglas predefinidas y limitaciones impuestas en una columna o en varias columnas; están vinculados a los valores de la columna y ayudan a mantener la integridad, precisión y confiabilidad de los datos de las columnas especificadas.

En pocas palabras, solo los datos que cumplen con la regla de restricción se insertan correctamente en la columna. La operación de inserción finaliza si los datos no cumplen los criterios.

Esta publicación asume que ha encontrado bases de datos relacionales, específicamente MySQL, y espera fortalecer su conocimiento en el dominio. En última instancia, compartiré algunos consejos para interactuar con restricciones de clave externa.

Restricciones de clave principal: un resumen

Una tabla en SQL implica una columna o varias que contienen valores clave que identifican con precisión cada fila en los sistemas. La columna o columnas tituladas clave principal (PK) de la tabla tiene la función de hacer cumplir la integridad de la entidad de la tabla. Las restricciones de clave principal garantizan datos únicos y, a menudo, se definen en una columna de identidad.

Al especificar las restricciones de la clave principal para su tabla, el motor de la base de datos impone automáticamente la singularidad de los datos al generar índices únicos para cada una de las columnas principales. Las claves principales ofrecen una ventaja extrema cuando se utilizan en consultas al proporcionar un acceso rápido a los datos.

Si las restricciones de clave principal se definen en varias columnas, se denomina clave principal compuesta o compuesta. Y en este caso, cada columna de clave principal puede contener valores duplicados. Sin embargo, los valores combinados de todas las columnas de la clave principal deben ser únicos.

Un buen ejemplo es un caso en el que tiene una tabla con las columnas `id`, `names` y `age`. Cuando define su restricción de clave principal en la combinación de `id` y `names`, puede tener instancias duplicadas de los valores `id` o `names`. Aún así, cada combinación debe ser única para evitar filas duplicadas. Por lo tanto, podría tener registros con `id=1` y `name=Walter`, y `age-22 «y `id=1`, `name=Henry` y `age=27`, pero no puede tener otros registros con `id=1` y `name=Walter` porque la combinación no es única.

Aquí hay algunos aspectos esenciales que debe saber:

  • Una tabla contiene solo una restricción de clave principal.
  • Las claves primarias no pueden exceder las 16 columnas y una longitud máxima de 900 caracteres.
  • Los índices generados por las claves primarias pueden aumentar los de la tabla. Sin embargo, la cantidad de índices agrupados en una tabla no puede exceder 1 y la cantidad de índices no agrupados en una tabla está limitada a 999.
  • Cuando agrupado y no agrupado no se especifican para una restricción clave, agrupado se toma automáticamente.
  • Todas las columnas declaradas dentro de una restricción de clave principal deben definirse como no nulas. Si este no es el caso, todas las columnas vinculadas en la restricción tienen su nulabilidad configurada robóticamente como no nula.
  • Cuando las claves principales se definen en el tipo de columna definida por el usuario de Common Language Runtime (CLR), la implementación del tipo debe admitir la ordenación binaria.
  • Restricciones de clave externa: un resumen

    Una clave externa (FK) implica una columna o una combinación de varias utilizadas para crear y vincular un enlace entre dos tablas y administra los datos que se almacenarán en una tabla de clave externa.

    Una referencia de clave externa implica crear un enlace entre dos tablas; cuando una columna o columnas que contienen la clave principal de otra tabla son referenciadas por una columna o columnas en una tabla diferente.

    En el escenario de referencia de clave externa, se crea una conexión entre dos tablas cuando una columna o columnas que contienen claves principales en una tabla son referenciadas por columnas en otra.

    En un caso de uso práctico, puede tener una tabla, Sales.SalesOrderHeader, con una clave externa vinculada a otra tabla, Sales.Person, porque existe una relación lógica entre los vendedores y los pedidos de ventas.

    Aquí, SalesPersonID en la columna SalesOrderHeader se combina con la columna de clave principal de la tabla SalesPerson. La clave externa de la tabla SalesPerson es la columna SalesPersonID en SalesOrderHeader.

    Esta relación define una regla: un valor SalesPersonID no puede estar en su tabla SalesOrderHeader si no existe en la tabla SalesPerson.

    Una tabla puede hacer referencia hasta a otras 253 columnas y tablas como claves externas, también denominadas referencias salientes. Desde 2016, el servidor SQL ha aumentado la cantidad de tablas y columnas a las que puede hacer referencia en una sola tabla, también conocidas como referencias entrantes, de 253 a 10000. Sin embargo, el aumento viene con algunas restricciones:

  • Las referencias de claves foráneas superiores a 253 solo están disponibles para las operaciones DELETE DML. MERGE y UPDATE no son compatibles.
  • Las tablas con referencias de clave externa a sí mismas tienen un máximo de 253 referencias de clave externa.
  • Para los índices de almacén de columnas, las tablas optimizadas para memoria y las tablas de clave externa particionada, las referencias de clave externa están limitadas a 253.
  • ¿Cuáles son los beneficios de las claves foráneas?

    Como se mencionó anteriormente, las restricciones de clave externa juegan un papel esencial para salvaguardar la integridad y la consistencia de los datos en la base de datos relacional. Aquí hay un desglose de las razones por las que las restricciones de clave externa son esenciales.

  • Integridad referencial: las restricciones de clave externa garantizan que cada registro de la tabla secundaria se corresponda con un registro de la tabla principal, lo que garantiza la coherencia de los datos en ambas tablas.
  • Prevención de registros huérfanos: si elimina una tabla principal, las restricciones de clave externa garantizan que su tabla secundaria asociada también se elimine, lo que evita instancias de registros huérfanos que podrían generar inconsistencias en los datos.
  • Rendimiento mejorado: las restricciones de clave externa aumentan el rendimiento de las consultas al permitir que el sistema de administración de la base de datos optimice las consultas en función de las relaciones de las tablas.
  • Índices de restricciones de clave externa

    Las restricciones de clave externa no crean automáticamente índices correspondientes como el principal. Puede crear manualmente índices para restricciones de clave externa; es beneficioso por las siguientes razones.

    • Las columnas de clave externa se utilizan a menudo en los criterios de unión cuando se combinan datos de tablas relacionadas en consultas haciendo coincidir las columnas vinculadas a la restricción. Los índices ayudan a la base de datos a encontrar datos asociados en una tabla externa.
    • Si cambia las restricciones de clave principal, se verifican con las foráneas en las tablas relacionadas.

    No es obligatorio crear índices. Todavía puede combinar datos de dos tablas sin especificar las restricciones de clave principal y externa. Sin embargo, agregar restricciones de clave externa optimiza las tablas y las combina en una consulta que cumple con sus criterios de uso de claves. Si cambia las restricciones de clave principal, se verifican con las foráneas relacionadas.

    Sugerencias para crear restricciones de clave externa en SQL

    Ya ha dedicado mucho tiempo a la especulación; respondió el por qué. Cambiemos nuestro enfoque y limitémoslo a las tácticas para crear restricciones de clave externa; responde el cómo.

    Un campo de `Clave externa` en una tabla se refiere a la `Clave principal` de otra. La tabla con la clave principal es su tabla principal. Y la tabla con la clave foránea se llama tabla secundaria. Sumerjámonos.

    Creación de una clave externa al crear una tabla

    Al crear una tabla, también puede crear una restricción de clave externa para mantener la integridad referencial. Aquí está cómo hacerlo:

    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE,
        FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );

    El código anterior crea una tabla llamada ‘pedidos’ con la clave de entero principal ‘order_id’, otro entero ‘customer_id’ y la fecha ‘order_date’. En este caso, la restricción FOREIGN KEY se agrega a la columna ‘customer_id’ y hace referencia al ‘customer_id’ en su tabla ‘customers’.

    Crear una clave externa después de crear una tabla

    Suponga que ya ha creado una tabla y desea agregar una restricción de clave externa; use la instrucción `ALTER TABLE` en su código. Mire el fragmento de código a continuación.

    ALTER TABLE orders
    ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

    En este caso, ha agregado una columna de restricción de clave externa ‘customer_id’ en la tabla ‘orders’ para hacer referencia a la columna ‘customer_id’ en la tabla ‘customers’.

    Creación de una clave externa sin verificar los datos existentes

    Cuando agrega una restricción de clave externa a una tabla, la base de datos verifica automáticamente los datos existentes para garantizar la coherencia con la restricción. Sin embargo, si sabe que los datos son consistentes y desea agregar una restricción sin la verificación de coherencia, aquí le mostramos cómo hacerlo.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    NOT VALIDATE;

    El comando NOT VALIDATE le dice a la base de datos que no verifique los datos existentes. Este caso particular es útil en casos específicos. Por ejemplo, cuando tienes datos masivos y deseas completar el proceso de validación.

    Creación de una clave externa a través de ELIMINAR/ACTUALIZAR

    A medida que crea restricciones de clave externa, puede indicar la acción que se debe realizar en los casos en que la fila a la que se hace referencia se actualice o elimine. En este caso, está utilizando restricciones de integridad referencial en cascada para dictar las acciones que se deben realizar. Incluyen:

    #1. SIN ACCIÓN

    Al igual que con muchas otras bases de datos, la regla ‘SIN ACCIÓN’ es el comportamiento predeterminado cuando crea una restricción de clave externa. Esto significa que no se realiza ninguna acción cuando se elimina o actualiza la fila a la que se hace referencia.

    El motor de base de datos genera un error si se infringe la restricción de clave externa. Sin embargo, esto no se recomienda porque puede dar lugar a problemas de integridad referencial, ya que es necesario aplicar la restricción de clave externa. Aquí hay un ejemplo de cómo hacerlo:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    #2. CASCADA

    La regla ‘CASCADE’ es otra opción para las acciones ‘ON DELETE’ y ‘ON UPDATE’ al crear restricciones de clave externa. Cuando se implementa, significa que cada vez que se actualiza o elimina una fila en las tablas principales, las filas a las que se hace referencia se actualizan o eliminan en consecuencia. Esta técnica es poderosa cuando se mantiene la integridad referencial. Aquí hay un ejemplo:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    Debe estar atento al usar esta regla, ya que puede causar consecuencias indeseables si no se usa con cuidado. Querrá evitar eliminar accidentalmente demasiados datos o crear referencias circulares. Por lo tanto, use esta opción solo si es necesario y con precaución.

    Hay algunas reglas sobre el uso de CASCADE:

    • No puede especificar CASCADE si una columna de marca de tiempo es parte de la clave externa o referenciada.
    • Si su tabla tiene un activador INSTEAD OF DELETE, no puede especificar ON DELETED CASCADE.
    • No puede especificar ON UPDATE CASCADE si su tabla tiene un disparador INSTEAD OF UPDATE.

    #3. ESTABLECER NULO

    Cuando elimina o actualiza una fila correspondiente en la tabla principal, todos los valores que componen la clave externa se establecen en nulo. Esta regla de restricción exige que las columnas de claves foráneas sean anulables para ejecutarse y no se pueden especificar para tablas que tengan activadores INSTEAD OF UPDATE. Aquí hay un ejemplo de cómo hacerlo.

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET NULL
    ON UPDATE SET NULL

    En este caso, ha establecido que la columna de clave externa ‘customer_id’ en la tabla «pedidos» sea nula si la fila correspondiente en la tabla «clientes» se elimina o actualiza.

    #4. ESTABLECER PREDETERMINADO

    Aquí, está configurando todos los valores que hacen que la clave externa sea predeterminada, siempre que la fila a la que se hace referencia en la tabla principal se actualice o elimine.

    Esta restricción se ejecuta si todas las columnas de clave externa tienen definiciones predeterminadas. Si una columna admite valores NULL, su valor predeterminado se establece en NULL. Tenga en cuenta que esta opción no se puede especificar para tablas con activadores INSTEAD OF UPDATE. Aquí hay un ejemplo:

    ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customers
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

    En el caso anterior, ha establecido el ‘customer_id’ en la tabla de «pedidos» en su valor predeterminado, lo que sucede cuando la fila correspondiente en la tabla de «clientes» se elimina o actualiza.

    Ultimas palabras

    En esta guía, repasó las restricciones de clave principal y profundizó en las restricciones de clave externa. También ha encontrado varias técnicas para crear restricciones de clave externa. Y si bien hay muchas formas de crear restricciones de clave externa, esta publicación ha desentrañado los métodos.

    Y esperando que hayas aprendido nuevas técnicas; no estás limitado a combinarlos. Por ejemplo, los métodos de restricción CASCADE, SET NULL, SET DEFAULT y NO ACTION se pueden combinar en tablas con relaciones referenciales.

    Si su tabla no encuentra ACCIÓN, regresa a otras reglas de restricción. En otros casos, una acción ELIMINAR puede desencadenar una combinación de estas reglas y la regla SIN ACCIÓN se ejecutará como la última.

    A continuación, consulte la hoja de trucos de SQL.