2011-11-16 2 views
1

J'ai une question concernant les clés étrangères dans une table InnoDB. J'ai 4 tables dans ma base de données:MySQL et les clés étrangères

Inscription:

  • UID - clé primaire
  • AFID
  • PlanID
  • Industryid

Affiliés:

  • AFID - clé primaire

Plans:

  • PlanID - clé primaire

Industries:

  • Industryid - Clé primaire

SQL que j'utilise pour ajouter les clés:

CONSTRAINT `FK_signup_industries` FOREIGN KEY (`industryid`) REFERENCES `industries` (`industryid`) ON UPDATE CASCADE ON DELETE CASCADE, 
CONSTRAINT `FK_signup_affiliates` FOREIGN KEY (`afid`) REFERENCES `affiliates` (`afid`) ON UPDATE CASCADE ON DELETE CASCADE, 
CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE CASCADE 

ma question est:

Si je devais supprimer un plan ou d'une industrie sur leur tables respectives serait l'utilisateur dans la table d'inscription être supprimé? J'ai essayé de trouver des guides à ce sujet et ils ne l'expliquent pas très bien.

Fondamentalement ce que j'ai besoin fait est que la rangée dans la table d'inscription ne doit jamais être supprimée n'importe quoi. Lorsque j'utilise cette requête:

CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE NO ACTION 

Je reçois cette erreur:

Cannot delete a parent row. 

Répondre

1

Si vous avez besoin de la ligne de membre pour rester même si vous supprimez la ligne référencée dans les industries, les affiliés ou les plans, puis vous avez deux choix:

  • Ne déclarez pas de contrainte de clé étrangère. Cela supprime l'application de l'intégrité référentielle, mais autorise l'existence de lignes dans Signup qui référencent une valeur de clé primaire parent qui n'existe plus.

  • Utilisez ON DELETE SET NULL. Cela permet à la ligne de rester, mais la valeur de clé étrangère qui référence le parent désormais supprimé sera modifiée.*

Pour plus de détails, voir http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

* La spécification standard SQL définit également une règle DEFAULT SUPPRIMER SET, mais InnoDB ne supporte pas cette fonctionnalité.

+0

Donc, il n'y a aucun moyen de changer la valeur sur supprimer à quelque chose que je choisis (par exemple 5 ou 6)? –

+0

Vous pouvez écrire un déclencheur pour le faire. Ou modifiez-le à partir du code d'application avec une mise à jour avant de supprimer le parent auquel il fait référence. –