Sam
Sam

Reputation: 1838

postgres primary key not incrementing on insert (pgloader migration)

I have been trying to migrate my db to PostgreSQL 16.3 from MariaDB since I have some issue with some tables not creating a unique id on insert. Most work fine, but a few for some reason do not work properly

Here is a basic insert:

INSERT INTO brand (name, slug) VALUES ('moudle', 'moudle');

Result:

duplicate key value violates unique constraint "idx_18070_primary"

I'm new to PostgreSQL, and I'm not sure what could be going wrong and what to check.

I used pgloader and maybe forgot a setting?

LOAD DATABASE
     FROM      mysql://root:root@database/dev
     INTO      pgsql://app:pass@postgres/dev

 WITH include drop, create tables

CAST type json to jsonb
WITH prefetch rows = 100,
    preserve index names

 ALTER SCHEMA 'dev' RENAME TO 'public';

structure

EDIT: I just noticed that my problematic table for some reason does not have id_seq file as you can see from the table listing of Postbird. All other tables have it.

enter image description here

Upvotes: 1

Views: 188

Answers (1)

Pepe N O
Pepe N O

Reputation: 2354

EDIT: I just noticed that my problematic table for some reason does not have id_seq file as you can see from the table listing of Postbird. All other tables have it.

The problem is an auto-generate id out of sync. To find out what kind of auto-generated id is your column you could run

select * from information_schema.columns
where table_name='brand';

if id column has a default value (column default in the form nextval('<sequence_name>'::regclass)), then its explicitly associated with a sequence, or if it is marked as identity its implicitly associated with a sequence, to put them back on sync

for the first case (explicit sequence)

select setval('<name of the sequence in the default value>',
coalesce(max(id), 0) + 1, false) from brand;

for an identity (implicit)

select setval(pg_get_serial_sequence('brand', 'id'), 
coalesce(max(id), 0) + 1, false) from brand;

Fiddle to test

And to avoid this problems after migration in the first place you could also use the WITH option "reset sequences" as appears in pgloader official documentation.

Upvotes: 0

Related Questions