Skip to content

PostgreSQL identity column insert issue 'identity column defined as GENERATED ALWAYS' #2193

@captain-redbeard

Description

@captain-redbeard

Issue

The following error is returned when seeding a Postgres database where the seeds have values in the identity column.

[PDOException] SQLSTATE[428C9]: <<Unknown error>>: 7 ERROR:  cannot insert a non-DEFAULT value into column "id"
DETAIL:  Column "id" is an identity column defined as GENERATED ALWAYS.
HINT:  Use OVERRIDING SYSTEM VALUE to override. in /Applications/Develop/webdev/agent-commission/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 346

Versions

Phinx version: 0.13.4
Database: PostgreSQL 14.7

Cause

The reason this error is returned is because the table was created with the identity column having GENERATED ALWAYS through the migration which means that no writes are allowed to this column. Source: https://www.postgresql.org/docs/15/sql-createtable.html

Proposed Solution

Update Create Table

Create the identity column with GENERATED BY DEFAULT, this allows the user specified value to take precedence. Source: https://www.postgresql.org/docs/15/sql-createtable.html

Impacted code:

Update Insert

To maintain maximum support the INSERT command could be updated to include OVERRIDING SYSTEM VALUE.

Impacted code:

Example insert statement:

INSERT INTO my_table (id, first_name, last_name)
OVERRIDING SYSTEM VALUE
VALUES (1, 'hello', 'world');

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions