diff --git a/create_test.go b/create_test.go index dc82de50..2d71c9a6 100644 --- a/create_test.go +++ b/create_test.go @@ -57,6 +57,21 @@ func TestCreate(t *testing.T) { } } +func TestCreateWithAutoIncrement(t *testing.T) { + if dialect := os.Getenv("GORM_DIALECT"); dialect != "postgres" { + t.Skip("Skipping this because only postgres properly support auto_increment on a non-primary_key column") + } + user1 := User{} + user2 := User{} + + DB.Create(&user1) + DB.Create(&user2) + + if user2.Sequence-user1.Sequence != 1 { + t.Errorf("Auto increment should apply on Sequence") + } +} + func TestCreateWithNoGORMPrimayKey(t *testing.T) { if dialect := os.Getenv("GORM_DIALECT"); dialect == "mssql" { t.Skip("Skipping this because MSSQL will return identity only if the table has an Id column") diff --git a/dialect_mysql.go b/dialect_mysql.go index bc4828de..0ddcea4d 100644 --- a/dialect_mysql.go +++ b/dialect_mysql.go @@ -30,6 +30,14 @@ func (mysql) Quote(key string) string { func (mysql) DataTypeOf(field *StructField) string { var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field) + // MySQL allows only one auto increment column per table, and it must + // be a KEY column. + if _, ok := field.TagSettings["AUTO_INCREMENT"]; ok { + if _, ok = field.TagSettings["INDEX"]; !ok && !field.IsPrimaryKey { + delete(field.TagSettings, "AUTO_INCREMENT") + } + } + if sqlType == "" { switch dataValue.Kind() { case reflect.Bool: diff --git a/migration_test.go b/migration_test.go index 592dadb7..ec33efc1 100644 --- a/migration_test.go +++ b/migration_test.go @@ -33,6 +33,7 @@ type User struct { Company Company Role PasswordHash []byte + Sequence uint `gorm:"AUTO_INCREMENT"` IgnoreMe int64 `sql:"-"` IgnoreStringSlice []string `sql:"-"` Ignored struct{ Name string } `sql:"-"` diff --git a/model_struct.go b/model_struct.go index eb3762f4..d8f9ed1b 100644 --- a/model_struct.go +++ b/model_struct.go @@ -175,6 +175,10 @@ func (scope *Scope) GetModelStruct() *ModelStruct { field.HasDefaultValue = true } + if _, ok := field.TagSettings["AUTO_INCREMENT"]; ok { + field.HasDefaultValue = true + } + indirectType := fieldStruct.Type for indirectType.Kind() == reflect.Ptr { indirectType = indirectType.Elem()