Vous n'êtes pas identifié(e).
Pages : 1
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
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.
damien clochard
http://dalibo.org | http://dalibo.com
Hors ligne
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
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
Pages : 1