Maison >base de données >tutoriel mysql >Impossible de supprimer ou de mettre à jour une ligne parent : une contrainte de clé étrangère échoue - Comment résoudre l'erreur MySQL : la ligne parent a une contrainte de clé étrangère

Impossible de supprimer ou de mettre à jour une ligne parent : une contrainte de clé étrangère échoue - Comment résoudre l'erreur MySQL : la ligne parent a une contrainte de clé étrangère

WBOY
WBOYoriginal
2023-10-05 08:49:141941parcourir

Cannot delete or update a parent row: a foreign key constraint fails - 如何解决MySQL报错:父行有外键约束

Comment résoudre l'erreur MySQL : la ligne parent a des contraintes de clé étrangère, des exemples de code spécifiques sont nécessaires

Lors du développement à l'aide d'une base de données MySQL, nous rencontrons souvent un message d'erreur : "Impossible de supprimer ou de mettre à jour une ligne parent : une clé étrangère la contrainte échoue" (Impossible de supprimer ou de mettre à jour la ligne parent : une contrainte de clé étrangère existe).

Ce message d'erreur apparaît généralement lorsque nous essayons de supprimer ou de mettre à jour une ligne référencée par des enregistrements dans d'autres tables. Dans ce cas, MySQL empêchera l'opération de suppression ou de mise à jour sur la ligne parent en fonction de la contrainte de clé étrangère. Afin de résoudre ce problème, nous devons gérer les contraintes de clé étrangère en conséquence.

Ce qui suit vous fournira quelques méthodes pour résoudre ce problème, avec des exemples de code spécifiques.

  1. Supprimer les données de la ligne enfant associées
    Avant d'effectuer une opération de suppression ou de mise à jour, nous devons supprimer les données de la ligne enfant liées à la ligne parent. Ceci peut être réalisé en définissant l'attribut ON DELETE CASCADE de la clé étrangère. Lorsqu'une ligne parent est supprimée, toutes les lignes enfants qui font référence à la ligne parent sont également automatiquement supprimées.

Par exemple, supposons que nous ayons deux tables : orders et order_items. Le champ order_id de la table order_items est une référence de clé étrangère à la commande dans la table orders. Lorsque nous souhaitons supprimer une commande dans la table orders, nous devons d'abord supprimer les données des sous-lignes liées à la commande dans la table order_items. ordersorder_itemsorder_items表的order_id字段是对orders表中订单的外键引用。当我们要删除orders表中的某个订单时,必须先删除order_items表中与该订单相关的子行数据。

具体代码示例如下:

CREATE TABLE orders(
    id INT PRIMARY KEY,
    order_name VARCHAR(50)
);

CREATE TABLE order_items(
    id INT PRIMARY KEY,
    order_id INT,
    item_name VARCHAR(50),
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
);

在上面的代码中,我们在创建order_items表时将order_id字段设置为对orders表的外键约束,并指定了ON DELETE CASCADE。这样,当我们删除orders表中的某个订单时,与该订单相关的order_items表中的记录也会被自动删除。

  1. 解除外键约束后删除
    如果我们不希望设置ON DELETE CASCADE,或者无法删除与父行相关的子行数据,我们可以先解除外键约束,然后再进行删除操作。

具体代码示例如下:

ALTER TABLE order_items DROP FOREIGN KEY fk_order_items_order_id;

上面的代码中,我们使用ALTER TABLE语句来删除order_items表中对orders表的外键约束。

接下来,我们可以执行删除操作,如下所示:

DELETE FROM orders WHERE id = 1;

在执行上面的删除语句时,MySQL将不再验证与被删除行相关的外键约束,从而成功删除父行。

  1. 更新父行的值
    在某些情况下,我们可能只想更新父行的值而不是删除它。在这种情况下,我们需要先更新与该父行相关的所有子行的外键引用,然后再更新父行的值。

具体代码示例如下:

UPDATE order_items SET order_id = 2 WHERE order_id = 1;
UPDATE orders SET id = 2 WHERE id = 1;

在上面的代码中,我们首先更新order_items表中的外键引用,将之前引用父行ID为1的记录的order_id字段值更新为2。然后,我们再更新orders

L'exemple de code spécifique est le suivant :

rrreee

Dans le code ci-dessus, nous définissons le champ order_id sur orders lors de la création du order_items table Contraintes de clé étrangère sur la table et ON DELETE CASCADE est spécifié. De cette façon, lorsque nous supprimons une commande dans la table orders, les enregistrements de la table order_items liés à la commande seront également automatiquement supprimés.

    Supprimer après avoir libéré la contrainte de clé étrangère

    Si nous ne voulons pas définir ON DELETE CASCADE, ou si nous ne pouvons pas supprimer les données de la ligne enfant liées à la ligne parent, nous pouvons d'abord libérer la contrainte de clé étrangère puis supprimez-le.

    🎜🎜L'exemple de code spécifique est le suivant : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons l'instruction ALTER TABLE pour supprimer la table orders dans le order_items contraintes de clé étrangère de la table. 🎜🎜Ensuite, nous pouvons effectuer une opération de suppression comme indiqué ci-dessous : 🎜rrreee🎜 Lors de l'exécution de l'instruction delete ci-dessus, MySQL ne validera plus les contraintes de clé étrangère liées à la ligne supprimée, supprimant ainsi avec succès la ligne parent. 🎜
      🎜Mettre à jour la valeur de la ligne parent🎜Dans certains cas, nous pouvons simplement souhaiter mettre à jour la valeur de la ligne parent au lieu de la supprimer. Dans ce cas, nous devons mettre à jour les références de clé étrangère de toutes les lignes enfants liées à cette ligne parent avant de mettre à jour la valeur de la ligne parent. 🎜🎜🎜L'exemple de code spécifique est le suivant : 🎜rrreee🎜Dans le code ci-dessus, nous mettons d'abord à jour la référence de clé étrangère dans la table order_items vers le order_id qui faisait précédemment référence à l'enregistrement dont le parent L'ID de ligne est 1 La valeur du champ est mise à jour à 2. Ensuite, nous mettons à jour la valeur de l'enregistrement avec l'ID 1 dans la table orders à 2. 🎜🎜De cette façon, nous avons réussi à mettre à jour la valeur de la ligne parent. 🎜🎜Résumé : 🎜🎜Lorsque nous rencontrons une erreur MySQL : "Impossible de supprimer ou de mettre à jour une ligne parent : une contrainte de clé étrangère échoue", nous pouvons supprimer ou mettre à jour les données de la ligne enfant liées à la ligne parent en supprimant la contrainte de clé étrangère. La valeur de la ligne parent pour résoudre ce problème. Choisissez la méthode de traitement correspondante en fonction des besoins spécifiques de l'entreprise et des conditions de fonctionnement des données, et écrivez un code raisonnable pour gérer le problème des contraintes de clé étrangère. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn