Skip to content

Instantly share code, notes, and snippets.

@lud
Last active December 27, 2017 01:55
Show Gist options
  • Select an option

  • Save lud/c156364cfe12424b9fec to your computer and use it in GitHub Desktop.

Select an option

Save lud/c156364cfe12424b9fec to your computer and use it in GitHub Desktop.
Change Serial / Integer postgres column type

Création/Suppression des auto-incrément sur PostgreSQL

Ce script contient deux fonctions permettant de changer le typage d'une colonne serial de Postgres en integer et vice-versa.

Le type serial est simplement un integer couplé à une séquence. Il s'agit donc simplement de créer/supprimer la séquence et de changer la valeur par défaut de la colonne.

Postgres n'empêche pas de spécifier la valeur d'un champ serial sur une requête insert mais des outils comme FME peuvent traiter les colonnes serial différemment. Il est donc utile de pouvoir les désactiver temporairement.

Le nom du champ est id par défaut ici. À changer si nécessaire.

CREATE OR REPLACE FUNCTION change_serial_pk_to_integer (table_name varchar)
RETURNS void
AS $$
DECLARE
seq_name varchar := table_name || '_id_seq';
BEGIN
EXECUTE 'ALTER TABLE ' || quote_ident(table_name) || ' ALTER COLUMN id DROP DEFAULT';
EXECUTE 'DROP SEQUENCE ' || quote_ident(seq_name);
END;
$$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION change_integer_pk_to_serial (table_name varchar)
RETURNS void
AS $$
DECLARE
seq_name varchar := table_name || '_id_seq';
BEGIN
EXECUTE 'CREATE SEQUENCE ' || seq_name;
EXECUTE 'ALTER TABLE ' || quote_ident(table_name) || ' ALTER COLUMN id
SET DEFAULT nextval(''' || quote_ident(seq_name) || '''::regclass)';
EXECUTE 'SELECT setval(''' || quote_ident(seq_name) || ''', (select max(id)+1 from ' || quote_ident(table_name) || '))';
END;
$$
LANGUAGE plpgsql;
set search_path to public; -- nom du schema sur lequel on bosse
select change_serial_pk_to_integer('t1');
select change_integer_pk_to_serial('t1');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment