sql >> Database >  >> RDS >> Mysql

Sql:kan externe sleutel niet laten vallen vanwege automatisch gegenereerde beperking

Uw probleem is dat u uw beperkingen niet expliciet noemt. Hierdoor kan elke database een naam voor u kiezen. De truc hier is om uw externe sleutelbeperkingen expliciet een naam te geven, wanneer u de daadwerkelijke tabellen op zowel MySQL als MariaDB maakt:

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

Maar het oplossen van uw directe situatie zou meer werk vergen. Een optie zou zijn om de informatieschematabel op te vragen voor de betreffende tabel, om de werkelijke namen van de beperkingen te achterhalen:

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;

Dit zou één record moeten retourneren voor elke kolom en beperking. Met deze informatie zou u in staat moeten zijn om uw huidige wijzigingsverklaringen uit te voeren.

Dit is eenvoudig genoeg om te doen met een tool als Java of iets dergelijks. Als u dit rechtstreeks vanuit de database wilt doen, heeft u dynamische SQL nodig, wat waarschijnlijk betekent dat u een opgeslagen procedure moet schrijven.




  1. Ruwe query-join wijzigen in laravel Eloquent

  2. MySQL-wachtwoordfunctie

  3. MySQL implementeren op Ubuntu en volledig beheerd

  4. Laravel 5.3 Modellen maken Retouren Veld heeft geen standaardwaarde