复制和同步数据库 MSSQL

Replicate and sync database MSSQL

我正在尝试创建一个系统,从另一个应用程序的另一个数据库复制数据,应用一些重组并保存它。 我想保持 ID 与原始 ID 相同,但是使用 GORM,我不能将列名设置为 ID,否则它将始终忽略我传递的 ID 并使用自动递增的 ID。

我尝试创建一个不同的 ID 字段并将其设置为主键,它确实让我保留了传递的 ID,但我很难正常工作。

type User struct {
    EID          uint `gorm:"primaryKey"`
    ID           uint
    Username     string `gorm:"unique"`
}

user := User{
    ID: 133,
    Username: "example",
}

db.Clauses(clause.OnConflict{
    Columns:   []clause.Column{{Name: "id"}},
    DoUpdates: clause.AssignmentColumns([]string{"username"}),
}).Create(&user)

上面的例子是一个总是导致创建新记录而不是更新现有记录的例子。

关于不创建新记录而是更新现有记录的任何提示?

根据我的测试,复合键保留了传递的值,如果传递了属性 autoIncrement:false,它还会停止来自 auto-incrementing 的 ID 命名列并保留传递的值。因此,为了将键保留在具有单个主键的表中,我在 model/struct 中创建了一个我从未填充的虚拟键,从而保存了我传递的键。

type User struct {
    DummyKey      uint   `gorm:"primaryKey;autoIncrement:false"`
    ID           uint   `gorm:"primaryKey;autoIncrement:false"`
}

user := User{
    ID: 133,
    Username: "example",
}

db.Clauses(clause.OnConflict{
    DoUpdates: clause.AssignmentColumns([]string{"username"}),
}).Create(&user)

我还从更新插入中删除了列属性,因为它没有考虑我在那里设置的任何参数。单独使用主键似乎效果很好。