Your Question

表中有一个 id 字段,我并不想将它设置为主键,因此,我设置了 primaryKey:false,但是不起作用。

type Test struct {
    ID  int64 `gorm:"autoIncrement:false;primaryKey:false;column:id;type:bigint;not null" json:"-"` 
}

查看源码后,发现了这一段:

    prioritizedPrimaryField := schema.LookUpField("id")
    if prioritizedPrimaryField == nil {
        prioritizedPrimaryField = schema.LookUpField("ID")
    }

    if prioritizedPrimaryField != nil {
        if prioritizedPrimaryField.PrimaryKey {
            schema.PrioritizedPrimaryField = prioritizedPrimaryField
        } else if len(schema.PrimaryFields) == 0 {
            prioritizedPrimaryField.PrimaryKey = true
            schema.PrioritizedPrimaryField = prioritizedPrimaryField
            schema.PrimaryFields = append(schema.PrimaryFields, prioritizedPrimaryField)
        }
    }

我不明白 else if len(schema.PrimaryFields) == 0 都明确表示没有主键字段了,为什么硬是要塞一个 id 字段作为主键?

Expected answer

设置 primaryKey:false 后,不管是不是 id 字段,都不应该将字段设置为主键。

Comment From: icetech233

你直接删除 autoIncrement:false;primaryKey:false;column:id;再试试, 重新换个主键