Maison  >  Article  >  développement back-end  >  Gorm : Impossible d'ajouter ou de mettre à jour la ligne enfant - la contrainte de clé étrangère échoue lors de l'auto-référence

Gorm : Impossible d'ajouter ou de mettre à jour la ligne enfant - la contrainte de clé étrangère échoue lors de l'auto-référence

王林
王林avant
2024-02-09 09:18:101060parcourir

Gorm:无法添加或更新子行 - 外键约束在自引用时失败

Au cours du processus de développement, l'éditeur PHP Xinyi rencontre parfois l'erreur "Impossible d'ajouter ou de mettre à jour une ligne enfant - la contrainte de clé étrangère a échoué lors de l'auto-référence". Cette erreur se produit généralement lorsqu'il existe des auto-références dans la base de données, par exemple un champ d'une table qui fait référence à un autre champ de la table. Dans ce cas, si la contrainte de clé étrangère n'est pas configurée correctement, cela provoquera une erreur indiquant que la ligne enfant ne peut pas être ajoutée ou mise à jour. Ensuite, nous présenterons quelques méthodes pour résoudre ce problème.

Contenu des questions

J'ai une structure comme celle-ci :

type category struct {
    code           *int      `gorm:"unique;primarykey;"`
    parentcategory *category `gorm:"foreignkey:code"`
}
Une

category elle-même peut avoir une parentcategory, qui provient également d'un categorytype. Il se référence donc lui-même. S'il s'agit de la première catégorie, elle n'a pas de catégorie parent.

J'ai un tableau avec 4 catégories, comme mentionné ci-dessus, la première n'a pas de catégorie parent ab.

Lorsque vous enregistrez ces catégories l'une après l'autre (en commençant par la première sans parentcategory , j'obtiens ces erreurs (imprimez simplement les deux premières ici) :

Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ps_product_service`.`categories`, CONSTRAINT `fk_categories_parent_category` FOREIGN KEY (`code`) REFERENCES `categories` (`code`))
[20.890ms] [rows:0] INSERT INTO `categories` (`code`) VALUES (0) RETURNING `code`
Error when creating category: Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ps_product_service`.`categories`, CONSTRAINT `fk_categories_parent_category` FOREIGN KEY (`code`) REFERENCES `categories` (`code`))&{Code:0x140003c6a00 ParentCategory:<nil>}
2023/06/19 21:31:44 Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ps_product_service`.`categories`, CONSTRAINT `fk_categories_parent_category` FOREIGN KEY (`code`) REFERENCES `categories` (`code`))
[7.689ms] [rows:0] INSERT INTO `categories` (`code`) VALUES (99) RETURNING `code`
Error when creating category: Error 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`ps_product_service`.`categories`, CONSTRAINT `fk_categories_parent_category` FOREIGN KEY (`code`) REFERENCES `categories` (`code`))&{Code:0x140003c6a20 ParentCategory:<nil>}

Je ne sais vraiment pas ce que je dois faire ici. Quelqu'un peut-il m'aider à résoudre ce problème ?

Solution

Je dois utiliser le code suivant pour gérer vos besoins :

package main

import (
    "fmt"

    "github.com/samber/lo"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type category struct {
    code             uint `gorm:"unique;primarykey;"`
    parentcategoryid *uint
    parentcategory   *category `gorm:"foreignkey:parentcategoryid"`
}

func main() {
    dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable"
    db, err := gorm.open(postgres.open(dsn))
    if err != nil {
        panic(err)
    }
    db.automigrate(&category{})

    // load dummy data
    db.create(&category{
        code:             1,
        parentcategoryid: nil,
    })
    db.create(&category{
        code:             2,
        parentcategoryid: lo.toptr[uint](1),
    })
    db.create(&category{
        code:             3,
        parentcategoryid: lo.toptr[uint](2),
    })
    db.create(&category{
        code:             4,
        parentcategoryid: lo.toptr[uint](1),
    })

    // reading logic
    var categories []category
    if err := db.model(&category{}).find(&categories).error; err != nil {
        panic(err)
    }
    for _, v := range categories {
        if v.parentcategoryid == nil {
            fmt.printf("id: %v\tparentcategoryid: <nil>\n", v.code)
            continue
        }
        fmt.printf("id: %v\tparentcategoryid: %v\n", v.code, *v.parentcategoryid)
    }
}

Si je comprends ce dont vous avez besoin, vous devez disposer d'un tableau qui se référence lui-même. C'est pourquoi je l'ai défini ainsi category 结构。每个类别都有自己的 parentcategoryid sauf si la catégorie n'a pas de parent. Si vous essayez d'exécuter le code précédent, vous devriez obtenir le résultat suivant :

id: 1   parentCategoryId: <nil>
id: 2   parentCategoryId: 1
id: 3   parentCategoryId: 2
id: 4   parentCategoryId: 1

Peut-être que je n'ai pas compris quelque chose à votre question, si c'est le cas, faites-le-moi savoir et je mettrai à jour ma réponse, merci !

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer