1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (la restricción FOREIGN KEY puede provocar ciclos o varias rutas de cascada)
SQL Server¿Qué significa?
La foreign key que añade podría crear un ciclo o varias rutas de eliminación/actualización en cascada hacia la misma tabla en operaciones en cascada (ON DELETE/UPDATE CASCADE). SQL Server la rechaza para evitar un comportamiento ambiguo de la cascada.
¿Por qué ocurre?
Una FK con acción en cascada que crea una referencia circular entre tablas (A->B->A) o varias rutas de cascada hacia una tabla. SQL Server no lo permite para evitar un orden de cascada ambiguo y bucles infinitos.
Cómo solucionarlo
Defina la foreign key como ON DELETE NO ACTION / ON UPDATE NO ACTION (quite la cascada): ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; Implemente la eliminación en cascada necesaria con un trigger INSTEAD OF DELETE: el trigger elimina primero las filas hijas y después la fila padre (p. ej., DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;). Un trigger AFTER DELETE no funciona; la comprobación de la FK se ejecuta antes del trigger, por lo que la eliminación se rechaza con el error 547. Revise las dependencias circulares del modelo de datos.
Más entradas de este motor
- 1101Could not allocate a new page because of insufficient disk space in filegroup (no se pudo asignar una nueva página por falta de espacio en disco en el filegroup)
- 3729Cannot DROP because it is being referenced by object (no se puede eliminar porque otro objeto lo referencia)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement (falló la transacción snapshot porque una sentencia DDL modificó el objeto)
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission (no se encuentra el objeto/principal porque no existe o no tiene permiso)
- 4834You do not have permission to use the bulk load statement (no tiene permiso para usar la sentencia de carga masiva)
- 10928Resource limit for the database has been reached (Azure SQL) (se alcanzó el límite de recursos de la base de datos)