Question

J'essaie de créer une clé étrangère sur deux colonnes d'une table pour pointer vers la même colonne d'une autre table, mais il me semble avoir une erreur...

Voici ce que je fais :

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;

Mais je reçois

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

Cependant, si je n'ai qu'une seule colonne, le tableau est correctement créé.

Quelqu'un pourrait-il m'indiquer où se trouve l'erreur ?

Merci n

Était-ce utile?

La solution

Je l'ai essayé ici et j'ai eu la même erreur.Cela fonctionne cependant :

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

Oui, je sais - ton script devrait travailler (même si cela ne semble pas avoir beaucoup de sens).Pourtant, je suppose que cette nouvelle version est meilleure.

Autres conseils

Le problème semble être que vous spécifiez deux fois la même colonne parent dans la même clé étrangère (c'est-à-dire (ID, ID)).Les éléments suivants devraient fonctionner :

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 )
    )

Si vous souhaitez que deux colonnes dans une table enfant fassent référence à la même colonne de la table parent, vous devez alors ajouter deux références de clé étrangère comme indiqué par rsenna car celles-ci représentent deux relations indépendantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top