Ir al contenido principal

SQL ON DELETE RESTRICT: Evita la pérdida accidental de datos

Comprende cómo SQL ON DELETE RESTRICT protege la integridad de los datos. Descubre cómo bloquea las eliminaciones inseguras y cuándo elegir esta opción en lugar de las reglas CASCADE o SET NULL.
Actualizado 16 ene 2026  · 10 min leer

Eliminar datos en SQL no suele ser tan sencillo como eliminar una sola fila. En las bases de datos relacionales, las tablas suelen estar conectadas entre sí, por lo que eliminar un registro en una de ellas puede afectar a otra tabla. 

SQL proporciona la cláusula « ON DELETE », que define lo que debe suceder cuando se elimina una fila referenciada. Después de la cláusula « ON DELETE », puedes especificar qué ocurre, como bloquear la eliminación, eliminar automáticamente la fila dependiente o actualizar los datos referenciados.

En este tutorial, te mostraré la restricción « ON DELETE RESTRICT », que impide la eliminación de una fila principal si aún existen filas secundarias dependientes. También explicaré detalladamente cómo funciona la restricción, por qué las bases de datos la aplican y cuándo es la opción adecuada en comparación con otras reglas de eliminación. Por último, si buscas el comportamiento contrario, es decir, que al eliminar una fila principal se eliminen automáticamente los registros relacionados, consulta nuestra guía sobre SQL ON DELETE CASCADE.

¿Qué es ON DELETE RESTRICT en SQL?

La restricción « ON DELETE RESTRICT » en SQL es una función de seguridad de la base de datos. Garantiza que no se pueda eliminar un registro «padre» si todavía hay registros «hijos» que apuntan a él.

Nota: Mientras que bases de datos como PostgreSQL y MySQL admiten directamente la palabra clave « RESTRICT », SQL Server aplica la misma restricción utilizando « ON DELETE NO ACTION » en su lugar.

Integridad referencial y claves externas

La integridad referencial es el principio según el cual las relaciones entre tablas deben seguir siendo válidas en todo momento. Las claves externas garantizan esto al exigir que los valores de una tabla secundaria se correspondan con las filas existentes en una tabla principal. Por ejemplo, un campo « DepartmentID » (Número de cuenta de cliente) de la tabla « Employees » (Cuentas de clientes) podría hacer referencia a un campo específico « ID » (Número de cuenta de cliente) de la tabla « Departments » (Cuentas de clientes).

Por lo tanto, las reglas de SQL « DELETE » (no se permite eliminar una fila padre) existen porque eliminar una fila padre puede romper esta relación. La base de datos necesita instrucciones claras sobre si bloquear la eliminación, aplicarla en cascada o aplicar otra acción a las filas dependientes.

¿Qué significa realmente RESTRICT?

Cuando defines una clave externa con ON DELETE RESTRICT, la base de datos comprueba si hay filas secundarias relacionadas antes de ejecutar una eliminación. Si existe un registro secundario, la operación de eliminación se rechaza automáticamente.  En este caso, RESTRICT impide que se produzca la eliminación en lugar de modificar los datos, como veremos más adelante en el tutorial.

Cómo funciona ON DELETE RESTRICT en SQL

Para comprender cómo funciona la restricción « ON DELETE RESTRICT », es necesario ver cómo la base de datos evalúa las eliminaciones paso a paso durante una transacción.

Relaciones entre tablas padre e hijo

En SQL, la tabla principal contiene los registros primarios, mientras que la tabla secundaria contiene los registros dependientes. Por ejemplo, tu base de datos puede tener una tabla principal Categories con un campo category_id de «Electrónica». La tabla secundaria Products tendrá un registro «Smartphone», que se vinculará a la tabla principal mediante category_id.

Cuando ejecutas un comando « DELETE » en la tabla principal, el motor de la base de datos analiza inmediatamente todas las tablas secundarias asociadas para ver si alguna fila apunta a ese ID principal específico.

¿Qué sucede cuando intentas eliminar filas restringidas?

Si intentas eliminar una fila principal que aún tiene referencias, la base de datos detiene la operación y genera un error. Este mensaje de error indica una violación de una restricción de clave externa.

Este comportamiento es intencionado, ya que te obliga a tomar una decisión consciente: eliminar o actualizar primero las filas secundarias dependientes, o reconsiderar si la fila principal debe eliminarse.

SQL ON DELETE RESTRICT frente a Otras reglas de eliminación

En un DBMS, existen reglas específicas que rigen cómo se pueden eliminar datos de tablas relacionadas. En esta sección, compararemos la restricción « ON DELETE RESTRICT » con las reglas de eliminación habituales en SQL, para que puedas ver claramente cómo afecta cada una de ellas a los datos relacionados.

RESTRICT frente a CASCADE en SQL

La restricción SQL « RESTRICT » (no se permite la eliminación de filas secundarias) bloquea la eliminación de filas principales si las filas secundarias hacen referencia a ellas, lo que garantiza que no se produzca una pérdida accidental de datos. La siguiente consulta muestra cómo implementar un RESTRICT o al definir el esquema de la tabla. Impide eliminar un cliente si hay algún pedido que haga referencia a él.

-- Parent table
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100)
);

-- Child table with ON DELETE RESTRICT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE RESTRICT
);

Sin embargo, la restricción SQL « CASCADE » garantiza que una eliminación borre automáticamente todas las filas secundarias dependientes. En el ejemplo siguiente, CASCADE permite la eliminación automática de todos los pedidos asociados a un cliente cuando se elimina el registro de ese cliente.

-- Child table with ON DELETE CASCADE
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE CASCADE
);

RESTRICT frente a SET NULL y SET DEFAULT

Las restricciones SQL SET NULL y SET DEFAULT conservan las filas secundarias, pero cambian la forma en que hacen referencia a la principal.

Por ejemplo, en la consulta siguiente, cuando se elimina un cliente, el campo « customer_id » (Relacionado con cliente) de los pedidos relacionados se establece en « NULL » (Relacionado con cliente), lo que mantiene los registros de los pedidos pero elimina el vínculo con el cliente.

-- Child table using SET NULL
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NULL,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET NULL
);

Si utilizas la restricción « SET DEFAULT » (Establecer como vacío), cuando se elimina un cliente, el campo « customer_id » (Estado de pedido) de los pedidos relacionados se establece en su valor predeterminado, conservando los registros de los pedidos y asignándoles un valor marcador de posición predefinido.

-- Child table using SET DEFAULT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT DEFAULT 0,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET DEFAULT
);

Creación de claves externas con ON DELETE RESTRICT en SQL

Para implementar la restricción « ON DELETE RESTRICT » en SQL, debes definirla al crear la relación entre dos tablas.

Definición de RESTRICT en esquemas de tablas

Puedes especificar el comportamiento de eliminación en SQL al crear la tabla o añadirlo posteriormente si tu tabla ya existe.

El siguiente ejemplo muestra cómo utilizar la restricción de clave externa SQL « ON DELETE RESTRICT » en la instrucción « CREATE TABLE » al definir una nueva tabla en SQL.

-- Stores department details
CREATE TABLE departments (
    department_id INT PRIMARY KEY, 
    department_name VARCHAR(100)
);

-- -- Prevents deleting a department with employees
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,      -- Unique employee identifier
    department_id INT, 
    CONSTRAINT fk_employees_departments
        FOREIGN KEY (department_id)
        REFERENCES departments(department_id)
        ON DELETE RESTRICT 
);

La consulta siguiente añade la misma regla de clave externa a una tabla existente employees en la instrucción SQL ALTER TABLE, para evitar la eliminación de departamentos a los que todavía hacen referencia los empleados.

-- Adds a foreign key constraint after the table already exists
ALTER TABLE employees
ADD CONSTRAINT fk_employees_departments
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE RESTRICT;    -- Blocks deletion of departments that have employees

Comportamiento predeterminado de eliminación en SQL

En muchos sistemas de bases de datos populares, como SQL Server, PostgreSQL y MySQL, el comportamiento predeterminado es « RESTRICT » (no se permite la reentrada). Si defines una clave externa sin especificar ninguna cláusula « ON DELETE », la base de datos normalmente actuará como si hubieras escrito « ON DELETE NO ACTION » o « ON DELETE RESTRICT ». El diseño de este motor de base de datos garantiza que recibas un mensaje de error en lugar de eliminar accidentalmente grandes cantidades de datos relacionados.

Casos de uso habituales de ON DELETE RESTRICT en SQL

En situaciones reales, la restricción SQL « ON DELETE RESTRICT » (no se permite la eliminación) se aplica cuando la integridad de los datos exige una supervisión explícita antes de las eliminaciones.

Protección de datos de referencia críticos

La restricción SQL « RESTRICT » (único) se utiliza habitualmente para tablas que representan datos de referencia básicos, como usuarios, cuentas, productos o valores de búsqueda. Estos registros suelen compartirse entre varias partes del sistema, y su eliminación automática podría provocar una pérdida generalizada de datos o incoherencias.

Por ejemplo, eliminar un usuario que todavía tiene pedidos, registros de auditoría o permisos no suele ser seguro. Con la restricción SQL « ON DELETE RESTRICT », la base de datos bloquea la eliminación y te obliga a resolver primero esas dependencias, preservando la integridad de los datos históricos y transaccionales.

Aplicación de flujos de trabajo de limpieza explícitos

La restricción SQL « RESTRICT » también resulta útil cuando deseas que la limpieza sea intencionada y trazable. Obliga a los programadores y administradores a ser cuidadosos con la forma en que manejan los datos. En lugar de permitir que la base de datos elimine automáticamente los registros, la restricción « RESTRICT » (Eliminación con comprobación de integridad) obliga a revisar los datos dependientes para decidir si se eliminan los registros secundarios, se reasignan a un nuevo registro principal o se cancela la operación.

Solución de problemas de errores DELETE causados por RESTRICT en SQL

Cuando la restricción « ON DELETE RESTRICT » bloquea una eliminación, el error resultante puede resultar confuso si no te lo esperas. Comprender estos errores te ayuda a resolverlos de forma segura.

Comprensión de los errores de violación de restricciones

Cuando intentas eliminar una fila principal que aún tiene referencias, la base de datos genera una violación de restricción de clave externa. A continuación se muestra cómo aparecerá el mensaje en diferentes sistemas de bases de datos:

  • PostgreSQL: ERROR: update or delete on table "parent_table" violates foreign key constraint "fk_name" on table "child_table"

  • MySQL: Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails…

  • SQL Server: The DELETE statement conflicted with the REFERENCE constraint "FK_Name". The conflict occurred in database "DBName", table "dbo.ChildTable", column 'ParentID'.

En todas las bases de datos, el mensaje de error indicará lo siguiente:

  • ¿Qué restricción de clave externa se ha infringido?
  • ¿Qué tabla actúa como secundaria?
  • ¿Qué valor clave sigue siendo referenciado?

Resolver de forma segura las eliminaciones bloqueadas

Si recibes el mensaje de error de eliminación bloqueada, pero deseas eliminar la fila principal, te recomiendo utilizar cualquiera de las siguientes opciones:

Elimina primero el registro secundario: Si ya no se necesitan los datos dependientes, ejecuta primero una instrucción « DELETE » en las filas secundarias y, a continuación, elimina el registro principal.

-- Step 1: Remove dependencies
DELETE FROM Orders WHERE CustomerID = 501; 
-- Step 2: Now the parent delete will work
DELETE FROM Customers WHERE CustomerID = 501;

Actualizar referencias secundarias: Si deseas conservar las filas secundarias pero eliminar la principal, actualiza las filas secundarias para que hagan referencia a un ID principal diferente.

-- Reassign orders to a "General" customer account (ID 999)
UPDATE Orders SET CustomerID = 999 WHERE CustomerID = 501;

Cambia la restricción: En casos administrativos excepcionales, puedes desactivar temporalmente las comprobaciones de claves externas. Esta es una operación arriesgada que puede provocar la corrupción de los datos si no se maneja con extremo cuidado.

Notas y comportamiento específicos de la base de datos

Aunque el concepto de la restricción « ON DELETE RESTRICT » en SQL es estándar en todas las bases de datos SQL, los distintos motores gestionan la sincronización y la lógica interna de forma ligeramente diferente.

Comportamiento de PostgreSQL, MySQL y SQL Server

En PostgreSQL, MySQL y SQL Server, la restricción « ON DELETE RESTRICT » (no se permite la eliminación de filas relacionadas) impide eliminar una fila principal cuando existen filas secundarias relacionadas. Sin embargo, estos motores presentan las siguientes diferencias sintácticas menores:

MySQL: Sigue estrictamente las restricciones de SQL RESTRICT. Si no especificas una regla, se utilizará de forma predeterminada RESTRICT.

-- MySQL: RESTRICT is the default if no rule is specified
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
);

PostgreSQL: Admite restricciones tanto de tipo « RESTRICT » como « NO ACTION ». Aunque se comportan de forma casi idéntica, RESTRICT es estrictamente inmediato, mientras que NO ACTION permite comprobaciones diferidas.

-- PostgreSQL: NO ACTION (can be deferred)
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE NO ACTION
);

SQL Server: Utiliza la restricción « NO ACTION » como equivalente al comportamiento estándar « RESTRICT ». No utiliza explícitamente la palabra clave « RESTRICT » en su sintaxis T-SQL, pero consigue el mismo resultado al impedir la eliminación.

-- SQL Server: Uses NO ACTION instead of RESTRICT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE NO ACTION
);

Recomiendo realizarnuestros cursos Introducción a SQL Server y Creación de bases de datos PostgreSQL paraobtener más información sobre las diferencias entre los dialectos SQL a la hora de crear bases de datos.

Restricciones diferidas y comportamiento de las transacciones

En configuraciones avanzadas de bases de datos, como PostgreSQL u Oracle, es posible que te encuentres con restricciones diferidas. Esto significa que la restricción se comprueba en el momento de la confirmación de la transacción, en lugar de inmediatamente cuando se ejecuta la instrucción ` DELETE `.

En estos sistemas, una eliminación que normalmente sería bloqueada por RESTRICT puede parecer que se ha realizado correctamente de forma temporal dentro de una transacción, pero fallará cuando intentes confirmarla. Esto permite realizar operaciones complejas de varios pasos, como eliminar y volver a insertar datos relacionados dentro de la misma transacción, al tiempo que se garantiza la integridad al final.

Nuestra curso Introducción a Oracle SQL te ayudará a comprender mejor cómo Oracle procesa las consultas.

Elegir la estrategia ON DELETE adecuada

Seleccionar la restricción correcta te ayuda a lograr un equilibrio entre la integridad de los datos y la facilidad de uso de la aplicación. Ten en cuenta los siguientes escenarios para ayudarte a elegir el método adecuado con la cláusula « ON DELETE ».

Cuando RESTRICT es la opción más segura

Utiliza la restricción SQL « ON DELETE RESTRICT » cuando:

  • Los datos son muy valiosos: Los registros principales son importantes y se consultan con frecuencia en la base de datos.

  • Se requiere revisión manual: Quieres forzar a un humano o a un flujo de lógica empresarial específico a decidir qué ocurre con los datos dependientes.

  • Prevención de eliminaciones «silenciosas»: Quieres asegurarte de que un programador no borre accidentalmente miles de filas con un solo comando « CASCADE ».

Te sugiero que pruebes SQL Server para administradores de bases de datos si diseñas o mantienes bases de datos de forma habitual como parte de tu trabajo. 

Cuándo considerar alternativas

Cuando la restricción « RESTRICT » (Eliminar elementos no necesarios) resulte demasiado rígida para tu sistema, ten en cuenta las siguientes opciones:

  • Utiliza la restricción « CASCADE » cuando el registro secundario no tenga sentido sin el registro principal.

  • Utiliza la restricción « SET NULL » cuando la relación sea opcional.

  • Utiliza la restricción « SET DEFAULT » cuando tengas un «marcador de posición» que deba heredar todos los registros huérfanos para que el sistema siga funcionando correctamente.

Conclusión

La restricción SQL « ON DELETE RESTRICT » (no se permite la eliminación con registros dependientes) es una regla de clave externa protectora que prioriza la integridad de los datos sobre la comodidad, ya que bloquea la eliminación de filas principales cuando aún existen registros secundarios dependientes. Al fomentar estrategias de limpieza deliberadas y una clara responsabilidad sobre las operaciones de eliminación, la restricción SQL « RESTRICT » actúa como una función de seguridad en el diseño relacional. Como práctica recomendada, elige siempre reglas de eliminación SQL basadas en la lógica empresarial y la semántica de los datos, en lugar de optar por la comodidad o las necesidades a corto plazo.

Te recomiendo que realices nuestro curso de Diseño de bases de datos, en el que aprenderás a crear y gestionar bases de datos, así como a seleccionar el sistema de gestión de bases de datos (DBMS) más adecuado a tus necesidades. También recomiendo probar nuestro programa de formación para ingenieros de datos asociados en SQL para aprender los fundamentos de la ingeniería de datos y el almacenamiento de datos.  


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Creo artículos que simplifican la ciencia de los datos y la analítica, haciéndolos fáciles de entender y accesibles.

Preguntas frecuentes sobre SQL ON DELETE RESTRICT

¿Cuál es la diferencia entre RESTRICT y NO ACTION?

En la mayoría de las bases de datos, se comportan de la misma manera. RESTRICT se comprueba inmediatamente, mientras que NO ACTION puede comprobarse al final de la instrucción o de la transacción.

¿Qué sucede cuando intentas eliminar una fila principal restringida?

La operación ` DELETE ` falla y la base de datos genera un error de violación de restricción de clave externa.

¿En qué se diferencia ON DELETE RESTRICT de ON DELETE CASCADE?

RESTRICT bloquea completamente la eliminación, mientras que CASCADE elimina automáticamente todas las filas secundarias dependientes.

¿Cómo se resuelve un DELETE bloqueado por ON DELETE RESTRICT?

¿Cómo se resuelve un DELETE bloqueado por ON DELETE RESTRICT?

¿Puedes cambiar una clave externa existente para usar ON DELETE RESTRICT?

Sí. Puedes eliminar y volver a crear la restricción de clave externa con ON DELETE RESTRICT utilizando ALTER TABLE.

Temas

Aprende SQL con DataCamp

Curso

Introducción a las bases de datos relacionales en SQL

4 h
181.7K
Aprende a crear bases de datos relacionales, una de las formas más eficaces de almacenar datos.
Ver detallesRight Arrow
Iniciar curso
Ver másRight Arrow
Relacionado

Tutorial

Introducción a los disparadores SQL: Guía para desarrolladores

Aprende a utilizar los disparadores SQL para automatizar tareas, mantener la integridad de los datos y mejorar el rendimiento de la base de datos. Prueba ejemplos prácticos como los comandos CREATE, ALTER y DROP en MySQL y Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

Tutorial

Cómo utilizar GROUP BY y HAVING en SQL

Una guía intuitiva para descubrir los dos comandos SQL más populares para agregar filas de tu conjunto de datos
Eugenia Anello's photo

Eugenia Anello

Tutorial

Ejemplos y tutoriales de consultas SQL

Si quiere iniciarse en SQL, nosotros le ayudamos. En este tutorial de SQL, le presentaremos las consultas SQL, una potente herramienta que nos permite trabajar con los datos almacenados en una base de datos. Verá cómo escribir consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

Tutorial

Comprender la función DECODE() de SQL

Aprende a utilizar DECODE() en Oracle para la lógica condicional en la transformación de datos. Compara DECODE() con la sentencia CASE WHEN en cuanto a rendimiento y comportamiento.
Allan Ouko's photo

Allan Ouko

Tutorial

Seleccionar varias columnas en SQL

Aprende a seleccionar fácilmente varias columnas de una tabla de base de datos en SQL, o a seleccionar todas las columnas de una tabla en una simple consulta.
DataCamp Team's photo

DataCamp Team

Tutorial

Cómo utilizar un alias SQL para simplificar tus consultas

Explora cómo el uso de un alias SQL simplifica tanto los nombres de las columnas como los de las tablas. Aprende por qué utilizar un alias SQL es clave para mejorar la legibilidad y gestionar uniones complejas.
Allan Ouko's photo

Allan Ouko

Ver másVer más