pg_get_serial_sequencepode ser utilizado para evitar quaisquer suposições incorrectas sobre o nome da sequência. Isso redefine a seqüência em um tiro:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
Ou de forma mais concisa:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), MAX(id)) FROM table_name;
No entanto, este formulário não pode lidar com mesas vazias corretamente, uma vez max (id) é nulo, e nem você pode setval 0 porque seria fora do alcance da seqüência. Uma solução para isso é recorrer ao ALTER SEQUENCEie sintaxe
ALTER SEQUENCE table_name_id_seq RESTART WITH 1;
ALTER SEQUENCE table_name_id_seq RESTART; -- 8.4 or higher
Mas ALTER SEQUENCEé de uso limitado porque o nome seqüência e valor de reinício não podem ser expressões.
Parece que a melhor solução para todos os fins é chamar setvalcom falso como o 3º parâmetro, permitindo-nos para especificar o "próximo valor a ser usado":
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
Este carrapatos todos os meus caixas:
- evita codificar a sequência real nome
- lida com mesas vazias corretamente
- lida com as tabelas com dados existentes, e não deixar um buraco na seqüência
Finalmente, note que pg_get_serial_sequencesó funciona se a sequência é de propriedade da coluna. Este será o caso se a coluna incrementando foi definido como um serialtipo, no entanto, se a sequência foi adicionada manualmente, é necessário assegurar ALTER SEQUENCE .. OWNED BYtambém é realizada.
ou seja, se serialtipo foi usado para a criação da tabela, isto deve todo o trabalho:
CREATE TABLE t1 (
id serial,
name varchar(20)
);
SELECT pg_get_serial_sequence('t1', 'id'); -- returns 't1_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
Mas se as sequências foram adicionados manualmente:
CREATE TABLE t2 (
id integer NOT NULL,
name varchar(20)
);
CREATE SEQUENCE t2_custom_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE t2 ALTER COLUMN id SET DEFAULT nextval('t2_custom_id_seq'::regclass);
ALTER SEQUENCE t2_custom_id_seq OWNED BY t2.id; -- required for pg_get_serial_sequence
SELECT pg_get_serial_sequence('t2', 'id'); -- returns 't2_custom_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t2', 'id'), coalesce(max(id),0) + 1, false) FROM t1;