Your Question

Is there a way to prevent foreign keys from copying over the default value of its reference?

In the docs, it says:

For a has one relationship, a foreign key field must also exist, the owner will save the primary key of the model belongs to it into this field. The field’s name is usually generated with has one model’s type plus its primary key, for the above example it is UserID.

I'm using a Postgres database with primary key default values of generated by default as identity. However, if the primary key is used as a foreign key, then the foreign key field will also have a default value of generated by default as identity. I don't think this is useful and also results in an extra sequence being created.

Example:

type User struct {
    ID        int64 `gorm:"type:bigint generated by default as identity"`
    Profiles  []Profile
}
type Profile struct {
    ID        int64 `gorm:"type:bigint generated by default as identity"`
    UserID    int64
    User      User
}

The above schema results in tables like:

                                       Table "public.users"
   Column   |           Type           | Collation | Nullable |             Default              
------------+--------------------------+-----------+----------+----------------------------------
 id         | bigint                   |           | not null | generated by default as identity
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)

                                      Table "public.profiles"
   Column   |           Type           | Collation | Nullable |             Default              
------------+--------------------------+-----------+----------+----------------------------------
 id         | bigint                   |           | not null | generated by default as identity
 user_id    | bigint                   |           | not null | generated by default as identity
Indexes:
    "profiles_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "fk_users_profiles" FOREIGN KEY (user_id) REFERENCES users(id)

                  List of relations
 Schema |          Name           |   Type   |  Owner  
--------+-------------------------+----------+---------
 public | users                   | table    | ---
 public | users_id_seq            | sequence | ---
 public | profiles                | table    | ---
 public | profiles_id_seq         | sequence | ---
 public | profiles_user_id_seq    | sequence | ---

The profiles_user_id_seq is unnecessary, and so is the default value for the user_id column in the profiles table.

The document you expected this should be explained

https://gorm.io/docs/has_one.html#Override-Foreign-Key

Expected answer

Comment From: gurkan0791

same problem

Comment From: a631807682

You can use autoincrement, gorm will convert it to a serial which is old implementation in postgres. Maybe we should support it, but it doesn't belong to the tag type

ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]

https://www.postgresql.org/docs/current/sql-altertable.html