Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Login to psql and run the following
- // What is the result?
- SELECT MAX(id) FROM your_table;
- // Then run...
- // This should be higher than the last result.
- SELECT nextval('your_table_id_seq');
- // If it's not higher... run this to try and fix it. (run a quick pg_dump first...)
- SELECT setval('your_table_id_seq', (SELECT MAX(id) FROM your_table)+1);
- CREATE OR REPLACE FUNCTION "reset_sequence" (tablename text, columnname text, sequence_name text) RETURNS "pg_catalog"."void" AS
- $body$
- DECLARE
- BEGIN
- EXECUTE 'SELECT setval( ''' || sequence_name || ''', ' || '(SELECT MAX(' || columnname || ') FROM ' || tablename || ')' || '+1)';
- END;
- $body$ LANGUAGE 'plpgsql';
- select table_name || '_' || column_name || '_seq', reset_sequence(table_name, column_name, table_name || '_' || column_name || '_seq') from information_schema.columns where column_default like 'nextval%';
- SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
- CREATE OR REPLACE FUNCTION sequence_max_value(oid) RETURNS bigint
- VOLATILE STRICT LANGUAGE plpgsql AS $$
- DECLARE
- tabrelid oid;
- colname name;
- r record;
- newmax bigint;
- BEGIN
- FOR tabrelid, colname IN SELECT attrelid, attname
- FROM pg_attribute
- WHERE (attrelid, attnum) IN (
- SELECT adrelid::regclass,adnum
- FROM pg_attrdef
- WHERE oid IN (SELECT objid
- FROM pg_depend
- WHERE refobjid = $1
- AND classid = 'pg_attrdef'::regclass
- )
- ) LOOP
- FOR r IN EXECUTE 'SELECT max(' || quote_ident(colname) || ') FROM ' || tabrelid::regclass LOOP
- IF newmax IS NULL OR r.max > newmax THEN
- newmax := r.max;
- END IF;
- END LOOP;
- END LOOP;
- RETURN newmax;
- END; $$ ;
- select relname, setval(oid, sequence_max_value(oid))
- from pg_class
- where relkind = 'S';
- select relname, setval(pg_class.oid, sequence_max_value(pg_class.oid))
- from pg_class, pg_namespace
- where pg_class.relnamespace = pg_namespace.oid and
- nspname = 'public' and
- relkind = 'S';
- alvherre=# d baz
- Tabla «public.baz»
- Columna | Tipo | Modificadores
- ---------+---------+------------------------------------------------
- a | integer | default nextval(('foo_a_seq'::text)::regclass)
- alvherre=# alter table baz alter a set default nextval('foo_a_seq');
- ALTER TABLE
- alvherre=# d baz
- Tabla «public.baz»
- Columna | Tipo | Modificadores
- ---------+---------+----------------------------------------
- a | integer | default nextval('foo_a_seq'::regclass)
- CREATE OR REPLACE FUNCTION "reset_sequence" (tablename text) RETURNS "pg_catalog"."void" AS
- $body$
- DECLARE
- BEGIN
- EXECUTE 'SELECT setval( '''
- || tablename
- || '_id_seq'', '
- || '(SELECT id + 1 FROM "'
- || tablename
- || '" ORDER BY id DESC LIMIT 1), false)';
- END;
- $body$ LANGUAGE 'plpgsql';
- select sequence_name, reset_sequence(split_part(sequence_name, '_id_seq',1)) from information_schema.sequences
- where sequence_schema='public';
- CREATE OR REPLACE FUNCTION rebuilt_sequence() RETURNS integer as ''
- DECLARE
- sequencedefs RECORD;
- c integer ;
- BEGIN
- FOR sequencedefs IN Select
- constraint_column_usage.table_name as tablename,
- constraint_column_usage.table_name as tablename,
- constraint_column_usage.column_name as columnname,
- replace(replace(columns.column_default,'''::regclass)',''),'nextval(''','') as sequencename
- from information_schema.constraint_column_usage,
- information_schema.columns
- where constraint_column_usage.table_schema ='public' AND
- columns.table_schema = 'public' AND
- columns.table_name=constraint_column_usage.table_name AND
- constraint_column_usage.column_name = columns.column_name AND
- columns.column_default is not null
- LOOP
- EXECUTE 'select max('||sequencedefs.columnname||') from ' || sequencedefs.tablename INTO c;
- IF c is not null THEN
- c = c+ 1;
- EXECUTE 'alter sequence ' || sequencedefs.sequencename ||' restart with ' ||c;
- END LOOP;
- RETURN 1;
- END;
- $$ LANGUAGE plpgsql;
- select sequence_name, --PG_CLASS.relname, PG_ATTRIBUTE.attname
- reset_sequence(split_part(sequence_name, '_id_seq',1))
- from PG_CLASS
- join PG_ATTRIBUTE on PG_ATTRIBUTE.attrelid = PG_CLASS.oid
- join information_schema.sequences
- on information_schema.sequences.sequence_name = PG_CLASS.relname || '_' || PG_ATTRIBUTE.attname
- where sequence_schema='public';
- drop function IF EXISTS rebuilt_sequences() RESTRICT;
- CREATE OR REPLACE FUNCTION rebuilt_sequences() RETURNS integer as
- $body$
- DECLARE sequencedefs RECORD; c integer ;
- BEGIN
- FOR sequencedefs IN Select
- constraint_column_usage.table_name as tablename,
- constraint_column_usage.table_name as tablename,
- constraint_column_usage.column_name as columnname,
- replace(replace(columns.column_default,'''::regclass)',''),'nextval(''','') as sequencename
- from information_schema.constraint_column_usage, information_schema.columns
- where constraint_column_usage.table_schema ='public' AND
- columns.table_schema = 'public' AND columns.table_name=constraint_column_usage.table_name
- AND constraint_column_usage.column_name = columns.column_name
- AND columns.column_default is not null
- LOOP
- EXECUTE 'select max('||sequencedefs.columnname||') from ' || sequencedefs.tablename INTO c;
- IF c is null THEN c = 0; END IF;
- IF c is not null THEN c = c+ 1; END IF;
- EXECUTE 'alter sequence ' || sequencedefs.sequencename ||' restart with ' || c;
- END LOOP;
- RETURN 1; END;
- $body$ LANGUAGE plpgsql;
- select rebuilt_sequences();
- --drop function IF EXISTS reset_sequence (text,text) RESTRICT;
- CREATE OR REPLACE FUNCTION "reset_sequence" (tablename text,columnname text) RETURNS bigint --"pg_catalog"."void"
- AS
- $body$
- DECLARE seqname character varying;
- c integer;
- BEGIN
- select tablename || '_' || columnname || '_seq' into seqname;
- EXECUTE 'SELECT max("' || columnname || '") FROM "' || tablename || '"' into c;
- if c is null then c = 0; end if;
- c = c+1; --because of substitution of setval with "alter sequence"
- --EXECUTE 'SELECT setval( "' || seqname || '", ' || cast(c as character varying) || ', false)'; DOES NOT WORK!!!
- EXECUTE 'alter sequence ' || seqname ||' restart with ' || cast(c as character varying);
- RETURN nextval(seqname)-1;
- END;
- $body$ LANGUAGE 'plpgsql';
- select sequence_name, PG_CLASS.relname, PG_ATTRIBUTE.attname,
- reset_sequence(PG_CLASS.relname,PG_ATTRIBUTE.attname)
- from PG_CLASS
- join PG_ATTRIBUTE on PG_ATTRIBUTE.attrelid = PG_CLASS.oid
- join information_schema.sequences
- on information_schema.sequences.sequence_name = PG_CLASS.relname || '_' || PG_ATTRIBUTE.attname || '_seq'
- where sequence_schema='public';
- BEGIN;
- CREATE OR REPLACE FUNCTION reset_sequence(_table_schema text, _tablename text, _columnname text, _sequence_name text)
- RETURNS pg_catalog.void AS
- $BODY$
- DECLARE
- BEGIN
- PERFORM 1
- FROM information_schema.sequences
- WHERE
- sequence_schema = _table_schema AND
- sequence_name = _sequence_name;
- IF FOUND THEN
- EXECUTE 'SELECT setval( ''' || _table_schema || '.' || _sequence_name || ''', ' || '(SELECT MAX(' || _columnname || ') FROM ' || _table_schema || '.' || _tablename || ')' || '+1)';
- ELSE
- RAISE WARNING 'SEQUENCE NOT UPDATED ON %.%', _tablename, _columnname;
- END IF;
- END;
- $BODY$
- LANGUAGE 'plpgsql';
- SELECT reset_sequence(table_schema, table_name, column_name, table_name || '_' || column_name || '_seq')
- FROM information_schema.columns
- WHERE column_default LIKE 'nextval%';
- DROP FUNCTION reset_sequence(_table_schema text, _tablename text, _columnname text, _sequence_name text) ;
- COMMIT;
Add Comment
Please, Sign In to add comment