Hi,
To avoid ID conflicts between your two Odoo databases during synchronization, we’ve configured each server to use a different number range for all auto-incrementing sequences.
- Server 1 (Local): generates only odd numbers (1, 3, 5, ...)
- Server 2 (External): generates only even numbers (2, 4, 6, ...)
This ensures both systems can safely create new records without any ID collisions.
To apply this, please follow these steps:
- Connect to PostgreSQL and select your Odoo database:
psql -U your_pg_user -d your_odoo_database |
(Replace your_pg_user and your_odoo_database with the actual PostgreSQL username and database name.)
- Then run the following script on each server:
-> On Server 1 (Odd IDs):
DO $$ DECLARE seq_name TEXT; BEGIN FOR seq_name IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public' LOOP EXECUTE format('ALTER SEQUENCE %I RESTART WITH 1 INCREMENT BY 2', seq_name); END LOOP; END $$; |
-> On Server 2 (Even IDs):
DO $$ DECLARE seq_name TEXT; BEGIN FOR seq_name IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public' LOOP EXECUTE format('ALTER SEQUENCE %I RESTART WITH 2 INCREMENT BY 2', seq_name); END LOOP; END $$; |
After applying this setup, both databases will generate unique IDs automatically, preventing any conflicts during syncing.
OR
If your databases already contain data, we need to make sure new IDs start after the highest existing ID in each table.
This ensures:
- No overlapping IDs during sync
- Continuity of your existing data without conflict or duplication
Connect to your databases and run the following query:
-> For Server 1 (Odd numbers — local server):
DO $$ DECLARE seq_name TEXT; tbl_name TEXT; col_name TEXT := 'id'; max_id BIGINT; col_exists BOOLEAN; BEGIN FOR seq_name IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public' LOOP tbl_name := replace(seq_name, '_id_seq', '');
-- Check if the table has an 'id' column SELECT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = tbl_name AND column_name = col_name ) INTO col_exists;
IF col_exists THEN BEGIN EXECUTE format('SELECT MAX(%I) FROM %I', col_name, tbl_name) INTO max_id; IF max_id IS NULL THEN max_id := 0; END IF; -- Set starting point to next available odd number IF (max_id + 1) % 2 = 0 THEN max_id := max_id + 2; ELSE max_id := max_id + 1; END IF; EXECUTE format('ALTER SEQUENCE %I RESTART WITH %s INCREMENT BY 2', seq_name, max_id); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'Skipped sequence % due to table error', seq_name; END; ELSE RAISE NOTICE 'Skipped sequence % (no "id" column in table %)', seq_name, tbl_name; END IF; END LOOP; END $$; |
-> For Server 2 (Even numbers — external server):
In the above script, simply adjust the logic to start with the next even number instead.
Hope it helps.