sql >> データベース >  >> RDS >> Mysql

SQL:自動生成された制約のために外部キーを削除できません

    問題は、制約に明示的に名前を付けていないことです。これにより、各データベースが名前を選択できるようになります。ここでの秘訣は、MySQLと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
    );
    

    しかし、あなたの当面の状況を修正するには、より多くの作業が必要になります。 1つのオプションは、関連するテーブルの情報スキーマテーブルをクエリして、実際の制約名を見つけることです。

    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;
    

    これにより、列と制約ごとに1つのレコードが返されます。この情報があれば、現在のalterステートメントを実行できるはずです。

    これは、Javaなどのツールを使用して行うのに十分簡単です。これをデータベースから直接実行する場合は、動的SQLが必要になります。これは、おそらくストアドプロシージャを作成することを意味します。




    1. Oracleの動的クロスタブクエリ

    2. 動的SQLServerピボット(UNPIVOT)列名から行値へ

    3. PDOが存在しない場所にMYSQL挿入

    4. javaString[]をpostgresプリペアドステートメントに設定中にエラーが発生しました