Heim >Backend-Entwicklung >Golang >Gorm: Untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden – Fremdschlüsseleinschränkung schlägt bei Selbstreferenz fehl
Während des Entwicklungsprozesses tritt beim PHP-Editor Xinyi manchmal der Fehler „Untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden – Fremdschlüsseleinschränkung bei Selbstreferenz fehlgeschlagen“ auf. Dieser Fehler tritt normalerweise auf, wenn in der Datenbank Selbstreferenzen vorhanden sind, beispielsweise ein Feld in einer Tabelle, das auf ein anderes Feld in der Tabelle verweist. Wenn in diesem Fall die Fremdschlüsseleinschränkung nicht korrekt konfiguriert ist, wird ein Fehler verursacht, der besagt, dass die untergeordnete Zeile nicht hinzugefügt oder aktualisiert werden kann. Als Nächstes stellen wir einige Methoden zur Lösung dieses Problems vor.
Ich habe eine Struktur wie diese:
type category struct { code *int `gorm:"unique;primarykey;"` parentcategory *category `gorm:"foreignkey:code"` }Eine Kategorie selbst kann eine übergeordnete Kategorie haben, die ebenfalls von einem Kategorietyp stammt. Es verweist also auf sich selbst. Wenn es sich um die erste Kategorie handelt, hat sie keine übergeordnete Kategorie.
Ich habe ein Array mit 4 Kategorien, wie oben erwähnt, die erste hat keine übergeordnete Kategorie. Wenn ich diese Kategorien nacheinander speichere (beginnend mit der ersten ohne parentcategory , erhalte ich diese Fehlermeldungen (drucken Sie einfach die ersten beiden hier aus):
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>}Ich weiß wirklich nicht, was ich hier tun soll. Kann mir jemand helfen, dieses Problem zu lösen? WorkaroundIch sollte den folgenden Code verwenden, um Ihre Anforderungen zu verwalten:
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) } }Wenn ich verstehe, was Sie brauchen, benötigen Sie eine Tabelle, die auf sich selbst verweist. Deshalb habe ich es so definiert
es sei denn, die Kategorie hat kein übergeordnetes Element. Wenn Sie versuchen, den vorherigen Code auszuführen, sollten Sie das folgende Ergebnis erhalten:
id: 1 parentCategoryId: <nil> id: 2 parentCategoryId: 1 id: 3 parentCategoryId: 2 id: 4 parentCategoryId: 1
Das obige ist der detaillierte Inhalt vonGorm: Untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden – Fremdschlüsseleinschränkung schlägt bei Selbstreferenz fehl. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!