sql >> Base de Datos >  >> RDS >> Mysql

Sql:no se puede eliminar la clave externa debido a una restricción generada automáticamente

Su problema es que no está nombrando explícitamente sus restricciones. Esto deja que cada base de datos elija un nombre para usted. El truco aquí es nombrar sus restricciones de clave externa explícitamente, cuando crea las tablas reales en MySQL y MariaDB:

CREATE TABLE job_template (
    ...,
    parent_id int NOT NULL,
    CONSTRAINT your_constraint FOREIGN KEY fk_name (parent_id)
        REFERENCES job_template(id) ON DELETE CASCADE
);

Pero arreglar su situación inmediata requeriría más trabajo. Una opción sería consultar la tabla de esquema de información, para la tabla involucrada, para averiguar los nombres de las restricciones reales:

USE INFORMATION_SCHEMA;

SELECT
   TABLE_NAME,
   COLUMN_NAME,
   CONSTRAINT_NAME,
   REFERENCED_TABLE_NAME,
   REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'your_db' AND
    TABLE_NAME = 'job_template' AND
    REFERENCED_COLUMN_NAME IS NOT NULL;

Esto debería devolver un registro para cada columna y restricción. Con esta información, debería poder ejecutar sus declaraciones de modificación actuales.

Esto es bastante fácil de hacer usando una herramienta como Java o algo similar. Si desea hacer esto directamente desde la base de datos, necesitará SQL dinámico, lo que probablemente signifique escribir un procedimiento almacenado.