Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Sql:não pode descartar a chave estrangeira devido à restrição gerada automaticamente


Seu problema é que você não está nomeando explicitamente suas restrições. Isso deixa cada banco de dados para escolher um nome para você. O truque aqui é nomear explicitamente suas restrições de chave estrangeira, quando você cria as tabelas reais no MySQL e no 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
);

Mas consertar sua situação imediata exigiria mais trabalho. Uma opção seria consultar a tabela de esquema de informações, para a tabela envolvida, para descobrir os nomes reais das restrições:
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;

Isso deve retornar um registro para cada coluna e restrição. Com essas informações, você poderá executar suas instruções alter atuais.

Isso é bastante fácil de fazer usando uma ferramenta como Java ou algo semelhante. Se você quiser fazer isso diretamente do banco de dados, precisará de SQL dinâmico, o que provavelmente significa escrever um procedimento armazenado.