MySQL Alter Tabela - Adicionar índice + Chave estranha Dê um erro 1005
-
27-09-2019 - |
Pergunta
O que há de errado com este comando alter -tabela:
ALTER TABLE `lp`
ADD COLUMN `RuleId` INT(10) NOT NULL DEFAULT -111 AFTER `Weight` , ,
ADD CONSTRAINT `fk_1` FOREIGN KEY (`RuleId` ) REFERENCES `Rules` (`RuleId` ) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD INDEX `fk_1` (`RuleId` ASC) ;
Se eu largar a linha
ADD CONSTRAINT `fk_1` FOREIGN KEY (`RuleId` ) REFERENCES `Rules` (`RuleId` ) ON DELETE NO ...
isso funciona ,
O erro que recebo é:
Error Code : 1005
Can't create table '..' (errno: 121)
Como posso adicionar uma chave estrangeira e índice no mesmo campo ?
Atualizar:
Eu tento me separar de 2 consultas, primeiro adicionar índice e, depois disso, adicione a chave estrangeira, o índice adicionou, mas a segunda consulta não funciona!
Quando eu mudo o nome da chave estrangeira (como: 'fk_2') e tento executá -la, recebo um erro: o código de erro: 1452 não pode adicionar ou atualizar uma linha infantil: uma restrição de chave estrangeira falha
Solução
Primeiro, crie o índice e segundo a restrição de chave estrangeira. O MySQL precisa de um índice para criar a chave estrangeira, é por isso que você precisa criar o índice primeiro. Use declarações separadas também.
Outras dicas
Eu tive o mesmo problema exatamente.
O que eu descobri é que você não pode adicionar uma chave estrangeira se já existir outra chave estrangeira no seu banco de dados com exatamente o mesmo nome. Mesmo que essa outra chave estrangeira esteja em uma tabela diferente.
Erro 1005 (hy000): Não é possível criar tabela './mydb/#sql-e4a_c715.frm' (errno: 121) Como mencionado acima, você receberá essa mensagem se estiver tentando adicionar uma restrição com um nome que é já usado em outro lugar.
(Tirado de aqui)
Então, apenas renomeie -o para algo aleatório para verificar se estou correto ..
Recebi esse erro depois de combinar DDLs de esquema de aplicativos n django usando o comando "gerencia.py sqlall".
Descobri que o DDL do MySQL exige que as declarações sejam agrupadas por Gentil nesta ordem. Especificamente, toda a tabela alterada ... adicione ... chave estrangeira ... devo ocorrer por último, ou o MySQL aumentará esse erro.
- CRIAR A TABELA ...
- Criar índice ...
- ALTER TABLE TABLE_NAME Adicionar nome de restrição Chave estrangeira ...