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.
J'ai une structure comme celle-ci :
type category struct { code *int `gorm:"unique;primarykey;"` parentcategory *category `gorm:"foreignkey:code"` }
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 ?
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!