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

#1 03/02/2010 13:25:39

titemoku
Membre

ajouter une colonne "serial" a une table existante

Bonjour,

J'ai une petite question sur un changement de clé primaire.
Suite à des dev je vais avoir des souci avec la clé primaire d'une table. En effet, la colonne qui est définie comme clé primaire, va pouvoir apparaitre plusieurs fois dans la table.
Du coup  je perd l'unicité de ma clé, et j'ai toujours besoin.

Je pensais donc rajouter une colonne "serial".
Comment est-ce que je peux rajouter un tel type de colonne à ma table?
et comment remplir automatiquement les lignes déjà présentes dans la table?
Je ne sais pas trop comment formuler mes requetes pour cela, pouvez-vous m'aider?



Merci

Hors ligne

#2 03/02/2010 14:14:46

daamien
damien clochard

Re : ajouter une colonne "serial" a une table existante

Ce n'est pas possible de manière automatique. Il faut créer le type SERIAL "à la main".

Par exemple, en imaginant que tu veux ajouter la colonne id dans la table t1 :

BEGIN;
CREATE SEQUENCE t1_id_seq;
ALTER TABLE t1 ADD COLUMN id INTEGER;
UPDATE t1 SET id = nextval('t1_id_seq'); 
ALTER TABLE t1 ALTER COLUMN id SET DEFAULT nextval('t1_id_seq');
ALTER TABLE t1 ALTER COLUMN id SET NOT NULL;
COMMIT;

Attention l'opération UPDATE peut être assez longue, suivant le volume de données dans la table t1.

Hors ligne

#3 03/02/2010 19:09:20

Marc Cousin
Membre

Re : ajouter une colonne "serial" a une table existante

Juste une remarque tout de même : une table qui n'a comme seule clé unique/not null une clé technique de type serial n'est pas normalisée (au sens formes normales pour une base de données)… C'est donc probablement à terme une table qui va entraîner des problèmes d'intégrité, voire de performance. Il n'y a pas de colonnes sur laquelle faire un unique/not null multi-colonne ?

Pas que la clé technique soit une mauvaise idée en soit pour simplifier les écritures de jointures, mais elle ne garantit pas l'unicité réelle des enregistrements dans la table…


Marc.

Hors ligne

#4 04/02/2010 11:50:27

SAS
Membre

Re : ajouter une colonne "serial" a une table existante

Bonjour,

En fait, cela peut s'obtenir de manière automatique :

test=# create table toto(id int primary key, tecste text);
test=# insert into toto values(1,'toto1');
test=# insert into toto values(2,'toto2');

alter table toto add column ma_serie bigserial ;

test=# \d toto
                            Table  public.toto 
 Colonne  |  Type   |                      Modificateurs
  ----------+---------+---------------------------------------------------------
   id       | integer | not null
 tecste   | text    |
 ma_serie | bigint  | not null default nextval('toto_ma_serie_seq'::regclass)
Index :
     toto_pkey  PRIMARY KEY, btree (id)

test=# select * from toto;
 id | tecste | ma_serie
----+--------+----------
  1 | toto1  |        1
  2 | toto2  |        2
(2 lignes)

Cela fonctionne au minimum depuis PostgreSQL 8.2 (je n'ai pas de version plus ancienne pour tester).


Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com

Hors ligne

Pied de page des forums