diff --git a/callback_update.go b/callback_update.go index 4c9952d2..64d71d7c 100644 --- a/callback_update.go +++ b/callback_update.go @@ -43,6 +43,11 @@ func Update(scope *Scope) { if updateAttrs, ok := scope.InstanceGet("gorm:update_attrs"); ok { for key, value := range updateAttrs.(map[string]interface{}) { + if !scope.Dialect().SupportUpdatePrimaryKey() { + if field, ok := scope.Fields()[key]; ok && field.IsPrimaryKey { + continue + } + } if scope.changeableDBColumn(key) { sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(key), scope.AddToVars(value))) } @@ -50,6 +55,9 @@ func Update(scope *Scope) { } else { fields := scope.Fields() for _, field := range fields { + if field.IsPrimaryKey && !scope.Dialect().SupportUpdatePrimaryKey() { + continue + } if scope.changeableField(field) && !field.IsPrimaryKey && field.IsNormal { sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface()))) } else if relationship := field.Relationship; relationship != nil && relationship.Kind == "belongs_to" { diff --git a/cockroach.go b/cockroach.go index 80008dee..828d7b0c 100644 --- a/cockroach.go +++ b/cockroach.go @@ -22,6 +22,10 @@ func (cockroach) SupportUniquePrimaryKey() bool { return false } +func (cockroach) SupportUpdatePrimaryKey() bool { + return false +} + func (cockroach) NewUniqueKey(scope *Scope) uint64 { rows, err := scope.NewDB().Raw(`SELECT experimental_unique_int()`).Rows() if err != nil { diff --git a/common_dialect.go b/common_dialect.go index 4d5d00a5..874523b2 100644 --- a/common_dialect.go +++ b/common_dialect.go @@ -20,6 +20,10 @@ func (commonDialect) SupportUniquePrimaryKey() bool { return true } +func (commonDialect) SupportUpdatePrimaryKey() bool { + return true +} + func (commonDialect) NewUniqueKey(scope *Scope) uint64 { panic("NewUniqueKey not supported by commonDialect") } diff --git a/dialect.go b/dialect.go index f2074d13..94294717 100644 --- a/dialect.go +++ b/dialect.go @@ -9,6 +9,7 @@ type Dialect interface { BinVar(i int) string SupportLastInsertId() bool SupportUniquePrimaryKey() bool + SupportUpdatePrimaryKey() bool NewUniqueKey(scope *Scope) uint64 HasTop() bool SqlTag(value reflect.Value, size int, autoIncrease bool) string