PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 04/05/2011 19:24:22

unisol
Membre

reparameter id non serial en serial

Bonjour,

suite à une importation, j'ai des champs non serial,
je souhaite les passer en serial. Mais PgAdmin ne me propose
pas de réaliser cette opération.
lorsque les tables sont vides, je réalise un drop table

DROP TABLE mode_paiement;

suivi d'une redéfinition de la table.
mais avec des données dedans c'est impossible.
qu'elle solutions a t'on dans un cas pareil
(passer

-- Table: mode_paiement

-- DROP TABLE mode_paiement;

CREATE TABLE mode_paiement
(
  id bigint NOT NULL,
  conditions character varying(50),
  carence bigint,
  nrosociete integer,
  CONSTRAINT id_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE mode_paiement OWNER TO postgres;

Hors ligne

#2 04/05/2011 20:51:05

kenrio
Membre

Re : reparameter id non serial en serial

Bonjour,

il faut créer une séquence et la faire partir depuis le max de ta colonne.
Voici la requête donné dans une doc.

CREATE SEQUENCE base_id2_seq;
SELECT setval('base_id2_seq',(SELECT MAX(id2)from base));
  ALTER TABLE base ALTER COLUMN id2 SET DEFAULT nextval('base_id2_seq');

Hors ligne

#3 04/05/2011 21:09:03

gleu
Administrateur

Re : reparameter id non serial en serial

Le seul moyen possible est celui par kenrio. Il n'est pas possible de changer le type d'une colonne par serial car serial n'est pas un type. C'est ce qu'on appelle un pseudo type.


Guillaume.

Hors ligne

#4 04/05/2011 21:14:21

Marc Cousin
Membre

Re : reparameter id non serial en serial

Exact. Une petite subtilité:
Pour que ça soit vraiment identique à un SERIAL, il faut rajouter
ALTER SEQUENCE base_id2_seq OWNED BY base.id2;

Comme ça, quand on drop la table base, la séquence part avec. Comme pour un serial...


Marc.

Hors ligne

Pied de page des forums