2013-07-12 2 views
0

J'utilise MySQL 5 pour essayer de créer deux tables. Voici les deux tableaux:Pourquoi MySQL n'autorise pas cette clé étrangère?

DROP TABLE IF EXISTS `users` ; 
CREATE TABLE IF NOT EXISTS `users` (
    `username` VARCHAR(50) not null , 
    `password` VARCHAR(50) not null,  
    `enabled` boolean not null, 
    `accountNonExpired` boolean not null, 
    `accountNonLocked` boolean not null, 
    `credentialsNonExpired` boolean not null, 
    PRIMARY KEY (`username`) 
) ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `authorities` ; 
create table IF NOT EXISTS `authorities` (
`username` VARCHAR(50) not null , 
`authority` varchar(50) not null, 
foreign key (`username`) references `users` (`username`), 
unique index authorities_idx_1 (username, authority) 
) engine = InnoDb; 

Lorsque je tente d'exécuter cette instruction, la table des utilisateurs est créé, mais je reçois l'erreur:

Error Code: 1005 
Can't create table 'dental.authorities' (errno: 150) 

Je ne vois pas pourquoi cette clé étrangère échoue lorsque les deux colonnes référencées sont identiques. Y at-il

+0

Cela se construit avec succès pour moi: http://sqlfiddle.com/#!2/1e9acf et semble bien. Quelle version de MySQL utilisez-vous? (tant que 'users' est créé en premier) –

+0

Pourquoi utilisez-vous une clé étrangère varchar et non un if? Utilisez un champ varchar comme une clé primaire est une mauvaise ideia – Lefsler

+0

avez-vous vérifié les commentaires d'une question similaire: http://stackoverflow.com/questions/1457305/mysql-creating-tables-with-foreign-keys-giving- errno-150? rq = 1 – Kaffee

Répondre

1

Les clés étrangères nécessitent que les deux clés aient le même jeu de caractères. Ajouter

DEFAULT CHARACTER SET = utf8; 

à votre deuxième table instruction CREATE.

Edit: Oh, on dirait que je suis en retard à la fête.

+0

Merci benfranke, je pensais que seul le type de données de la colonne devait correspondre. – sonoerin

1

En fonction de votre version du serveur et les paramètres, vous devrez peut-être ajouter

à l'instruction CREATE TABLE pour les « autorités ». Cela correspondra au jeu de caractères de la table référencée.

0

départ points suivants:

Je pense que DEFAULT CHARACTER SET = utf8; pas fourni au deuxième table

1. The two tables must be ENGINE=InnoDB. (can be others: ENGINE=MyISAM 
    works too) 
2. The two tables must have the same charset. 
3. The PK column(s) in the parent table and the FK column(s) must be 
    the same data type. 
4. The PK column(s) in the parent table and the FK column(s), if they 
    have a define collation type, must have the same collation type; 
5. If there is data already in the foreign key table, the FK column 
    value(s) must match values in the parent table PK columns. 
6. And the child table cannot be a temporary table. 

Hope this helps.

+0

"peut être d'autres: MOTEUR = MyISAM fonctionne aussi" <- tout faux! Vous n'obtenez pas d'erreur, encore MyISAM ne supporte pas les clés étrangères – fancyPants