2013-01-05 5 views
2

Je crée le schéma d'une de mes bases de données. J'ai deux des tableaux suivants ...Clé étrangère composite provenant de plusieurs tables

CREATE TABLE User(
userID INT AUTO_INCREMENT, 
... 
PRIMARY KEY(userID) 
); 

CREATE TABLE Tool(
toolID INT AUTO_INCREMENT, 
... 
PRIMARY KEY(toolID) 
) 

Je veux créer une table appelée hasTool qui a deux clés primaires des deux tables en utilisant une contrainte de clé étrangère. Cependant, en plus de cela, je veux faire de ces deux champs, une clé composite de la nouvelle table hasTool. J'ai essayé ce qui suit, mais il ne semble pas produire le comportement attendu:

CREATE TABLE gcHasCoordinates (
userID INT NOT NULL, 
toolID INT NOT NULL, 
PRIMARY KEY (userID , toolID), 
CONSTRAINT foreign_key_to_User FOREIGN KEY (userID) REFERENCES Coordinate(coordinateID) , 
CONSTRAINT foreign_key_to_Tool FOREIGN KEY (toolID) REFERENCES Tool(toolID) 
); 

Je veux permettre à la table pour permettre plusieurs instances de userID ou toolID, mais pas les deux, et être des valeurs existantes à la fois Tables utilisateur et outil.

Merci d'avance!

+1

Cela devrait fonctionner correctement, sauf que vous faites référence les noms de tables mal 'Références utilisateur (userid)' et 'Références outil (toolID)' –

Répondre

0

Et quel est le problème?

Sauf pour

CONSTRAINT foreign_key_to_Tool FOREIGN KEY (toolID) REFERENCES Tool(toolID) ON DELETE CASCADE ON UPDATE CASCADE 

Où que vous faites référence à la table incorrecte GeoCache au lieu de l'outil. Ça devrait marcher je pense.

Edit: Voici un coup d'oeil à this

+0

Excusez-moi, qui était une faute de frappe. Je l'éditais pour ce post, mais la requête sous-jacente est cohérente. – user625665

+0

Oh! Mais vous n'avez pas répondu à ce qui ne va pas. J'ai créé ma propre table en violon, vous pouvez y jeter un coup d'œil. –

+0

Merci! Pour une raison quelconque, cela ne fonctionnait que si j'avais ajouté l'INDEX aux deux champs. Je ne sais pas pourquoi, mais ça marche maintenant :) – user625665

0

Probablement, vous shold utiliser des types de données identiques. INT et INT NOT NULL sont différents types

Questions connexes