2010-10-25 28 views
0

J'ai deux tables:problème mysql simple avec les clés étrangères

Tableau Auteur: ID (ENTIER), AUTHOR_NAME (VARCHAR), prenom (VARCHAR), nom_famille (VARCHAR), preferred_name (VARCHAR) .

Tableau coécrit: ID (ENTIER) author1ID (ENTIER), author2ID (ENTIER), paper_ID (ENTIER) (ID du document co-auteur référencé par ce lien)

Je veux ajouter les contraintes de clé étrangère telles que author1ID et author2ID dans CoAuthored se réfèrent à l'ID dans Author. Je définissais les tableaux en tant que tels:

CREATE TABLE Author(ID INT, author_name VARCHAR(100), preferred_name VARCHAR(100), first_name VARCHAR(100), last_name VARCHAR(100), PRIMARY KEY(ID)) ENGINE=INNODB; 

CREATE TABLE CoAuthored(ID INT, author1ID INT, author2ID INT, paper_ID INT); 

C'est ma tentative de création de la clé étrangère:

ALTER TABLE CoAuthored ADD foreign key (author1ID) references Author(ID) on delete cascade on update cascade; 

Cette exécute très bien, mais lorsque je tente d 'ajouter un tuple qui contient un author1ID qui doesn n'existe pas dans ID, il me permet de le faire, ce qui signifie que la contrainte de clé étrangère ne fonctionne pas.

Que dois-je faire différemment? J'ai essayé de faire les deux tables MOTEUR = INNODB dans les instructions de création, mais alors j'obtiendrais une ERREUR 1005 impossible de créer une table.

+0

Définissez l'ID comme clé primaire dans la table Authod. –

Répondre

0

de: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6035435.html

Afin de mettre en place une relation de clé étrangère entre deux tables MySQL, trois conditions doivent être remplies:

  1. Les deux tables doivent être du type de table InnoDB.

  2. Les champs utilisés dans la relation de clé étrangère doivent être indexés.

  3. Les champs utilisés dans la relation de clé étrangère doivent être similaires dans le type de données.

Important: Pour les tables non-InnoDB, la clause FOREIGN KEY est ignorée.

+0

Merci pour la réponse rapide. Il s'avère que mon problème était que je n'indexais pas les colonnes que je voulais dans la clé étrangère. –

+0

qui ferait certainement l'affaire :) – clyc

0

Pouvez-vous essayer 'MOTEUR = InnoDB'

contraintes clés étrangères/contraintes clés fonctionnent avec les tables InnoDB seulement :)

--Cheers

0

d'abord: Vous devez définir tous tables impliquées avec des clés étrangères à InnoDB. MyISAM ne supporte tout simplement pas les clés étrangères.

Votre problème ici (erreur 1005) est un peu déroutant. Si vous faites un ALTER TABLE, cela signifie qu'il existe une valeur dans l'un des champs de clé étrangère qui n'a pas de référence dans une autre table. Lorsque vous créez des tables, assurez-vous que vous créez d'abord la table "parent", puis la deuxième et la troisième table.