sql-server - 复制和同步数据库 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,它还会阻止名为列的 ID 自动递增并保留传递的值。因此,为了将键保存在具有单个主键的表中,我在模型/结构中创建了一个我从未填充的虚拟键,从而保存了我传递的键。
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)
我还从 upsert 中删除了 columns 属性,因为它没有考虑我在那里设置的任何参数。单独使用主键似乎效果很好。
推荐阅读
- ios - UISwipeGestureRecognizer 获取开始和结束位置
- android - Glide 不兼容 androidx 导入 androidx.annotation
- android - 数据绑定:访问包含布局中的字段 - 布局被转换为视图
- sql-server - sql server 使用命名空间解析 xml
- android - 在 Android 手机上重新启用 WiFi 后,NsdManager 发现、立即丢失并重新发现相同的服务
- json - 通过 django 在引导表(python -> jquery)中加载熊猫数据框
- eclipse - Eclipse 项目在推送到 github 后在文件资源管理器中变得不可见
- c++ - 在任何情况下,switch 语句中的 using 声明是否合法?
- c++ - 如何使用 gcc 5.5 在 gdal 2.4 中启用 c++14
- python - Python:Mysql Escape 函数生成损坏的查询