MySQL contraintes de clés étrangères, effacer en cascade
Je veux utiliser des clés étrangères pour maintenir l'intégrité et éviter les orphelins (je l'ai déjà utiliser innoDB).
Comment puis-je faire un SQL de tresorerie de SUPPRESSION en CASCADE?
Si je supprime une catégorie alors comment faire en sorte qu'il ne serait pas de supprimer des produits qui sont aussi liées à d'autres catégories.
Le tableau croisé dynamique "categories_products" crée un plusieurs-à-plusieurs relations entre les deux autres tables.
categories
- id (INT)
- name (VARCHAR 255)
products
- id
- name
- price
categories_products
- categories_id
- products_id
- Hi - vous pouvez modifier la question du titre, c'est à propos des suppressions en cascade vraiment, pas spécifiquement les tableaux croisés dynamiques.
Vous devez vous connecter pour publier un commentaire.
Si votre suppressions en cascade nuke un produit parce qu'il est membre d'une catégorie qui a été tué, alors vous avez mis vos clés étrangères mal. Compte tenu de vos tables, vous devriez avoir le tableau suivant de l'installation:
De cette façon, vous pouvez supprimer un produit OU d'une catégorie, et seuls les enregistrements associés dans categories_products va mourir à ses côtés. La cascade de ne pas voyager plus loin en haut de l'arborescence et de supprimer le produit parent/catégorie table.
par exemple
Si vous supprimez le "rouge" de la catégorie, alors que le "rouge" entrée dans la table catégories meurt, ainsi que les deux entrées de prod/chats: 'les bottes rouges" et "tuniques rouges'.
Le supprimer ne sera pas en cascade plus loin et ne prendra pas les "bottes" et "couches " catégories".
commentaire suivi:
vous êtes encore à l'incompréhension comment en cascade supprime travail. Ils concernent seulement les tables dans lesquelles les "on delete cascade" est défini. Dans ce cas, la cascade est situé dans le "categories_products" de la table. Si vous supprimez le "rouge" de la catégorie, seuls les enregistrements qui va effacer en cascade dans categories_products sont ceux où
category_id = red
. Il ne touche pas tous les enregistrements où 'category_id = blue', et il ne serait pas voyager jusqu'à la table "produits", car il n'y a pas de clé étrangère est définie dans le tableau.Voici un exemple plus concret:
Disons que vous supprimer la catégorie #2 (bleu):
le SGBD va regarder toutes les tables qui ont une clé étrangère pointant les "catégories" de la table, et supprimer les enregistrements où l'id correspondant est de 2. Depuis que nous avons défini que la relation de clé étrangère dans
products_categories
, vous vous retrouvez avec cette table une fois la suppression terminée:Il n'y a pas de clé étrangère est définie dans le
products
de la table, de sorte que la cascade ne fonctionnera pas là, donc vous avez encore des bottes et des mitaines répertoriés. Il n'y a tout simplement pas de "bleu bottes" et non "bleu mitaines' plus.CASCADE
opérations. Sinon, le MySQL par défaut, MyISAM, seront utilisés et MyISAM ne prend pas en chargeCASCADE
opérations. Pour ce faire, il suffit d'ajouterENGINE InnoDB
avant la dernière;
.Je suis confus par la réponse à cette question, j'ai donc créé un cas de test dans MySQL, espérons que cette aide
Je pense (je ne suis pas certain) que les contraintes de clés étrangères ne la fera pas précisément ce que vous voulez, compte tenu de votre structure de la table. Peut-être la meilleure chose à faire est de définir une procédure stockée qui va supprimer une catégorie de la manière que vous voulez, et ensuite appeler cette procédure chaque fois que vous voulez supprimer une catégorie.
Vous devez également ajouter le suivant les contraintes de clé étrangère de la table de liaison:
La CONTRAINTE clause peut, bien sûr, apparaissent également dans l'instruction CREATE TABLE.
Avoir créé ces objets de schéma, vous pouvez supprimer une catégorie et d'obtenir le comportement que vous voulez par l'émission d'
CALL DeleteCategory(category_ID)
(où category_ID est la catégorie à supprimer), et il va se comporter de la façon dont vous le souhaitez. Mais il n'est pas question normaleDELETE FROM
requête, sauf si vous voulez plus de norme de comportement (c'est à dire supprimer de la table de liaison, lesproducts
seul).KEY pkey (product_id),
dans la troisièmeCREATE TABLE
requête en accepté de répondre?