Pergunta

Estou tentando criar uma chave estrangeira em duas colunas de uma tabela para apontar para a mesma coluna de outra tabela, mas parece que recebo um erro...

Aqui está o que eu faço:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1, col2)
                REFERENCES test1(ID, ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT
) ENGINE=InnoDB;

Mas eu entendo

ERROR 1005 (HY000): Can't create table 'DB.test2' (errno: 150)

Se eu tiver apenas uma coluna, entretanto, a tabela será criada corretamente.

Alguém poderia me indicar onde está o erro?

Obrigado n

Foi útil?

Solução

Tentei aqui e obtive o mesmo erro.Mas isso funciona:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT,
  CONSTRAINT fk2 FOREIGN KEY (col2)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT

) ENGINE=InnoDB

Sim, eu sei - seu roteiro deve trabalho (mesmo que não pareça fazer muito sentido).No entanto, acho que esta nova versão é melhor.

Outras dicas

O problema parece ser que você está especificando a mesma coluna pai duas vezes na mesma chave estrangeira (ou seja, (ID, ID)).O seguinte deve funcionar:

Create Table Test1
    (
    PK1 int not null
    , PK2 int not null
    , Primary Key ( PK1, PK2 )
    )

Create Table Test2
    (
    Id int not null Auto_Increment
    , PK1 int not null
    , PK2 int not null
    , Primary Key ( ID )
    , Constraint FK_Test2
        Foreign Key ( PK1, PK2 )
        References Test1( PK1, PK2 )
    )

Se for o caso de você desejar duas colunas em uma tabela filho referenciando a mesma coluna da tabela pai, você deverá adicionar duas referências de chave estrangeira, conforme mostrado por rsenna, pois elas representam duas relações independentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top