Gorm: Untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden – Fremdschlüsseleinschränkung schlägt bei Selbstreferenz fehl

王林
Freigeben: 2024-02-09 09:18:10
nach vorne
1090 Leute haben es durchsucht

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

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.

Frageninhalt

Ich habe eine Struktur wie diese:

type category struct {
    code           *int      `gorm:"unique;primarykey;"`
    parentcategory *category `gorm:"foreignkey:code"`
}
Nach dem Login kopieren
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>}
Nach dem Login kopieren
Ich weiß wirklich nicht, was ich hier tun soll. Kann mir jemand helfen, dieses Problem zu lösen?

Workaround

Ich 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)
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

Vielleicht habe ich mit Ihrer Frage nichts verstanden. Wenn das der Fall ist, lassen Sie es mich bitte wissen und ich werde meine Antwort aktualisieren, danke!

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!