Modifier une table et rajouter un ID unique

Ainsi, nous avons créé notre première table. Cependant, nous verrons pourquoi dans un autre chapitre, il peut être important de toujours (ou presque) avoir une clef unique sur une table.

Une clef unique, c’est quelque chose d’unique à chaque enregistrement dans la table, un enregistrement dans une des colonnes de l’enregistrement que l’on ne retrouve pas dans un autre enregistrement. Hors notre table n’a que trois entrées: un nom, un prénom et une date de naissance. Aucun de ces élément est garanti d’être un unique à un seul enregistrement.

Nous allons donc rajouter une colonne avec un type serial et déclarer cette colonne clef unique.

tutorial=> alter table famille add column id serial primary key;
ALTER TABLE
tutorial=> select * from famille;
  nom   | prenom | date_de_naissance | id
--------+--------+-------------------+----
 Dupont | Michel | 1956-12-31        |  1
(1 row)

tutorial=>

Et voila, notre table a une clef unique. Regardons ce qui s’est passé:

tutorial=> \d
               List of relations
 Schema |      Name      |   Type   |  Owner
--------+----------------+----------+----------
 public | famille        | table    | tutorial
 public | famille_id_seq | sequence | tutorial
(2 rows)

tutorial=> \d famille
                                         Table "public.famille"
      Column       |         Type          | Collation | Nullable |               Default
-------------------+-----------------------+-----------+----------+-------------------------------------
 nom               | character varying(32) |           |          |
 prenom            | character varying(32) |           |          |
 date_de_naissance | date                  |           |          |
 id                | integer               |           | not null | nextval('famille_id_seq'::regclass)
Indexes:
    "famille_pkey" PRIMARY KEY, btree (id)

tutorial=>

PostgreSQL a créé une sequence, puis il rajouté la colonne id avec le type int (nombre entier), puis il a défini la valeur par défaut de id comme étant la prochaine valeur de la séquence. Puis il a rajouté un index pour préciser que la colonne id est une PRIMARY KEY.

En fait, le type serial est un raccourci pratique, mais nous aurions pu créer la séquence manuellement, puis définir nous même la valeur par défaut.

tutorial=> create sequence seq_famille_id;
CREATE SEQUENCE
tutorial=> alter table famille add column id int primary key default nextval('seq_famille_id');
ALTER TABLE
tutorial=> \d famille
                                         Table "public.famille"
      Column       |         Type          | Collation | Nullable |               Default
-------------------+-----------------------+-----------+----------+-------------------------------------
 nom               | character varying(32) |           |          |
 prenom            | character varying(32) |           |          |
 date_de_naissance | date                  |           |          |
 id                | integer               |           | not null | nextval('seq_famille_id'::regclass)
Indexes:
    "famille_pkey" PRIMARY KEY, btree (id)

Bien que réalisées à la main, les opérations ont mené exactement au même résultat.

index suite…