Erro MySql 150 – Chaves Estrangeiras

Quando eu executo as duas consultas seguintes (eu as tirei para absolutamente necessário):

mysql> CREATE TABLE foo(id INT PRIMARY KEY); Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB; 

Eu recebo o seguinte erro: ERRO 1005 (HY000): Não é possível criar tabela ‘./test/bar.frm’ (errno: 150)

Onde o **** é meu erro? Eu não o encontrei enquanto olhava para isso por meia hora.

    De restrições FOREIGN KEY

    Se você recriar uma tabela que foi descartada, ela deverá ter uma definição que esteja em conformidade com as restrições de chave estrangeira que fazem referência a ela. Ele deve ter os nomes e os tipos de coluna corretos e deve ter índices nas chaves referenciadas, conforme indicado anteriormente. Se estes não estiverem satisfeitos, o MySQL retorna o número de erro 1005 e se refere ao erro 150 na mensagem de erro.

    Minha suspeita é que é porque você não criou o foo como InnoDB, já que todo o resto parece OK.

    Editar: da mesma página –

    Ambas as tabelas devem ser tabelas InnoDB e não devem ser tabelas TEMPORARY.

    Você pode usar o comando SHOW ENGINE INNODB STATUS

    Para criar uma chave estrangeira,

    1. tanto a coluna principal como a coluna de referência devem ter a mesma definição.
    2. o mecanismo de ambas as tabelas deve ser InnoDB.

    Você pode alterar o mecanismo de tabela usando este comando, por favor, faça o backup antes de executar este comando.

    alter table [nome da tabela] ENGINE = InnoDB;

    Eu tive o mesmo problema, para aqueles que estão tendo isso também:

    verifique o nome da tabela da tabela referenciada

    Eu tinha esquecido o ‘s’ no final do meu nome da tabela

    por exemplo, tabela Cliente -> Clientes

    🙂

    Além de muitas outras razões para acabar com o Erro 150 MySql (enquanto estiver usando InnoDB), Um dos motivos prováveis, é a KEY indefinida na declaração de criação da tabela contendo o nome da coluna referenciada como uma chave estrangeira na tabela relativa.

    Vamos dizer que a declaração de criação da tabela mestre é –

    CREATE TABLE 'master_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'record_id' char(10) NOT NULL,
    'name' varchar(50) NOT NULL DEFAULT '',
    'address' varchar(200) NOT NULL DEFAULT '',
    PRIMARY KEY ('id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    e a syntax create para a tabela relative_table em que a restrição de chave estrangeira é configurada a partir da tabela principal –

    CREATE TABLE 'relative_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'salary' int(10) NOT NULL DEFAULT '',
    'grade' char(2) NOT NULL DEFAULT '',
    'record_id' char(10) DEFAULT NULL,
    PRIMARY KEY ('id'),
    CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Este script definitivamente terminará com o Erro 150 do MySql se estiver usando o InnoDB.

    Para resolver isso, precisamos adicionar uma KEY para a coluna record_id na tabela master_table e, em seguida, fazer referência na tabela relative_table para ser usada como foreign_key.

    Finalmente, a instrução create para o master_table , será –

    CREATE TABLE 'master_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'record_id' char(10) NOT NULL,
    'name' varchar(50) NOT NULL DEFAULT '',
    'address' varchar(200) NOT NULL DEFAULT '',
    PRIMARY KEY ('id'),
    KEY 'record_id' ('record_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Eu tive o mesmo problema e o motivo foi que o “agrupamento” de colunas era diferente. Um era latin1 enquanto o outro era utf8

    Isso também pode acontecer se você não tiver dado o nome correto da coluna após a palavra-chave “references”.