2009-06-24 6 views
1

J'ai créé deux tables ORDRES et OrderItems avec la contrainte suivante:pourquoi FK contrainte ne fonctionne pas dans MySql

alter table OrderItems add constraint FK_Reference_30 foreign key (orderId) 
    references Orders (orderId) on delete restrict on update restrict; 

Si je veux supprimer une entrée dans la table ORDERS et que orderId est utilisé dans le tableau OrderItems, je devrait avoir une erreur ou un avertissement, je pense. Mais en réalité je n'ai rien. J'ai inséré deux lignes dans ORDERS et quelques lignes dans ORDERITEMS. Lorsque j'ai essayé de supprimer toutes les lignes dans ORDERS, je l'ai fait. Aucune plainte. J'utilise la base de données MySQL avec Toad for MySQL.

Répondre

5

Je suppose que vous utilisez les tables MyISAM.

Si vous exécutez « SHOW CREATE TABLE OrderItems » vous verrez qu'il n'a pas réussi à enregistrer la définition de clé étrangère.

tables MyISAM ne prennent pas en charge les clés étrangères. MySQL analyse la syntaxe, mais la supprime silencieusement lorsque vous utilisez MyISAM. Si vous utilisez des tables InnoDB pour Order et OrderItems, cela fonctionnera mieux.


Vous devez avoir activé InnoDB par défaut. Il serait inhabituel que ce soit désactivé. Vous pouvez vérifier que vous faites de cette façon:

mysql> show variables like 'have_innodb'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| have_innodb | YES | 
+---------------+-------+ 

Si cela est vrai, alors vous pouvez spécifier ENGINE=INNODB lorsque vous CREATE ou ALTER une table:

mysql> ALTER TABLE Orders ENGINE=INNODB; 
mysql> ALTER TABLE OrderItems ENGINE=INNODB; 

Assurez-vous de bien vérifier qu'il a réussi, avec SHOW CREATE TABLE <name>.

Maintenant, vous pouvez ajouter la contrainte, et il devrait prendre effet.

+0

Comment puis-je activer InnoDB? Je peux décommenter le contenu lié à InnoDB dans my.ini (dans WindowsXP machine) mais dois-je faire d'autres choses? J'utilise la version d'installation manuelle de MySQL – 5YrsLaterDBA

+0

avec l'option --innodb? J'aime: mysqld-nt --install --innodb – 5YrsLaterDBA

1

Quel est le moteur base de données utilisez-vous? InnoDB est le seul qui supporte les contraintes de clés étrangères.

Questions connexes