Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL:Fremdschlüssel kann aufgrund automatisch generierter Einschränkung nicht gelöscht werden

Ihr Problem ist, dass Sie Ihre Einschränkungen nicht explizit benennen. Dadurch kann jede Datenbank einen Namen für Sie auswählen. Der Trick hier besteht darin, Ihre Fremdschlüsseleinschränkungen explizit zu benennen, wenn Sie die eigentlichen Tabellen sowohl in MySQL als auch in MariaDB erstellen:

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
);

Aber die Behebung Ihrer unmittelbaren Situation würde mehr Arbeit erfordern. Eine Möglichkeit wäre, die Informationsschematabelle für die betroffene Tabelle abzufragen, um die tatsächlichen Beschränkungsnamen herauszufinden:

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;

Dies sollte einen Datensatz für jede Spalte und Einschränkung zurückgeben. Mit diesen Informationen sollten Sie in der Lage sein, Ihre aktuellen Alter-Anweisungen auszuführen.

Dies ist mit einem Tool wie Java oder ähnlichem einfach genug. Wenn Sie dies direkt von der Datenbank aus tun möchten, benötigen Sie dynamisches SQL, was wahrscheinlich bedeutet, dass Sie eine gespeicherte Prozedur schreiben.