Сервер MS- SQL выдает ошибку, когда два внешних ключа установлены в одной таблице с помощью GORM - PullRequest
0 голосов
/ 13 марта 2020

Я делаю миграцию базы данных, используя GORM. Поэтому я определяю структуры и запускаю их с помощью функции GIM AutoMigrate.

    type Person struct {
        ID          string    `gorm:"type:varchar(36);primary_key"`
    }

    err := db.Table("persons").AutoMigrate(&Person{}).Error

    type Address struct {
        ID         string      `gorm:"type:varchar(36);primary_key"`
        PersonID   string      `gorm:"column:person_id;type:varchar(36);NOT NULL"`
    }

    err = db.AutoMigrate(&Address{}).Error

    err = db.Model(&Address{}).AddForeignKey("person_id", "persons(id)", "NO ACTION", "CASCADE").Error

    type Contact struct {
        ID            string      `gorm:"type:varchar(36);primary_key"`
        AddressID     null.String `gorm:"column:address_id;type:varchar(36);NOT NULL"`
        PersonID      string      `gorm:"column:person_id;type:varchar(36);NOT NULL"`
    }

    err = db.AutoMigrate(&Contact{}).Error

    err = db.Model(&Contact{}).AddForeignKey("address_id", "addresses(id)", "NO ACTION", "CASCADE").Error

    err = db.Model(&Contact{}).AddForeignKey("person_id", "persons(id)", "NO ACTION", "CASCADE").Error

В приведенном выше коде, который является вторым вызовом функции AddForeignKey в таблице контактов, выдает ошибку:

mssql: Could not create constraint or index. See previous errors.

Даже если я перевожу внешний ключ person_id над внешним ключом address_id, внешний ключ address_id не будет работать.

Я использую сервер MS- SQL, используя последнюю настройку контейнера docker (microsoft / ms sql - server- linux: последние). Это что-то относительно именования ограничений. Если да, то как мы можем установить, используя GORM? С My- SQL.

все работает нормально. Было бы очень полезно, если бы я нашел решение. Я не могу запустить необработанные запросы. Миграции должны выполняться только с помощью GORM.

Спасибо

1 Ответ

0 голосов
/ 20 марта 2020

Несколько иностранных ключей не могут иметь «никаких действий», «каскад» на одной и той же таблице. Если вы не используете никаких действий, вы не можете делать никаких действий, но вам придется обрабатывать удаление и обновление себя. Обычно я включаю logmode и копирую, вставляю оператор log sql в SQL. Это даст более четкую ошибку.

...