Mysql
 sql >> Database >  >> RDS >> Mysql

Sql:impossibile eliminare la chiave esterna a causa del vincolo generato automaticamente

Il tuo problema è che non stai nominando esplicitamente i tuoi vincoli. Questo lascia ogni database a scegliere un nome per te. Il trucco qui è nominare esplicitamente i vincoli di chiave esterna, quando crei le tabelle effettive sia su MySQL che su 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
);

Ma risolvere la tua situazione immediata richiederebbe più lavoro. Un'opzione potrebbe essere quella di interrogare la tabella dello schema delle informazioni, per la tabella coinvolta, per scoprire i nomi dei vincoli effettivi:

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;

Questo dovrebbe restituire un record per ogni colonna e vincolo. Con queste informazioni, dovresti essere in grado di eseguire le tue attuali dichiarazioni di modifica.

Questo è abbastanza facile da fare usando uno strumento come Java o qualcosa di simile. Se vuoi farlo direttamente dal database, allora avresti bisogno di SQL dinamico, il che probabilmente significa scrivere una procedura memorizzata.