Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sql :impossible de supprimer la clé étrangère en raison d'une contrainte générée automatiquement

Votre problème est que vous ne nommez pas explicitement vos contraintes. Cela laisse chaque base de données choisir un nom pour vous. L'astuce ici consiste à nommer explicitement vos contraintes de clé étrangère, lorsque vous créez les tables réelles à la fois sur MySQL et 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
);

Mais régler votre situation immédiate nécessiterait plus de travail. Une option consisterait à interroger la table de schéma d'informations, pour la table concernée, afin de connaître les noms réels des contraintes :

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;

Cela devrait renvoyer un enregistrement pour chaque colonne et contrainte. Avec ces informations, vous devriez être en mesure d'exécuter vos instructions alter actuelles.

C'est assez facile à faire en utilisant un outil comme Java, ou quelque chose de similaire. Si vous souhaitez le faire directement à partir de la base de données, vous aurez besoin de SQL dynamique, ce qui signifie probablement écrire une procédure stockée.