Recebi este erro quando estava tentando alterar minha mesa.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Aqui está o meu CREATE TABLE STATEMENT, que foi executado com sucesso.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Então tentei executar esta instrução e recebi o erro acima.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Respostas:
O tipo e a definição do campo de chave estrangeira e a referência devem ser iguais. Isso significa que sua chave estrangeira não permite a alteração do tipo de seu campo.
Uma solução seria esta:
Agora você pode mudar sua person_id
recriar chave estrangeira
EDITAR: bloqueios adicionados acima, graças aos comentários
Eu adicionei um bloqueio de gravação acima
Todas as consultas de escrita em qualquer outra sessão que não a sua (
INSERT, UPDATE, DELETE
) irão esperar até o tempo limite ouUNLOCK TABLES
; É executadohttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP pediu uma explicação mais detalhada da linha "O tipo e definição de campo de chave estrangeira e referência devem ser iguais. Isso significa que sua chave estrangeira não permite alterar o tipo de seu campo."
Do MySQL 5.5 Reference Manual: FOREIGN KEY Constraints
fonte
person_id
logo após descartar a chave estrangeira? Parece que você não mudou nada, pois já é umSMALLINT UNSIGNED
.Você pode desativar as verificações de chave estrangeira:
Certifique-se de NÃO usar isso na produção e tenha um backup.
fonte
SET FOREIGN_KEY_CHECKS
é o escopo da sessão (outras sessões ainda terão a restrição FK aplicada). É perfeito para adicionar / removerAUTO_INCREMENT
(o que não altera o tipo de dados da coluna real), mas não funcionará se você tentar alterar o tipo de dados da coluna para "real" (digamos, de SMALLINT para INT), pois você obterá um legítimo150 FK constraint incorrectly formed
quando mysql tenta substituir a tabela antiga pela nova. Nesse caso, use a resposta aceita.Ao definir chaves (primárias ou estrangeiras), você está definindo restrições sobre como elas podem ser usadas, o que, por sua vez, limita o que você pode fazer com elas. Se você realmente deseja alterar a coluna, pode recriar a tabela sem as restrições, embora eu recomende não fazê-lo. De modo geral, se você tem uma situação em que deseja fazer algo, mas está bloqueado por uma restrição, é melhor resolvido alterando o que você deseja fazer em vez da restrição.
fonte