L3 Info : SGBD
 
◃  Ch. 7 Implantation des données avec SQL (DDL)  ▹
 

Automatisation de l'attribution des valeurs de clés

  • MySQL utilise la clause AUTO_INCREMENT lors de la définition de la colonne
    CREATE TABLE etudiant (
      etud_id INT AUTO_INCREMENT PRIMARY KEY,
      etud_nom VARCHAR(50) NOT NULL,
      etud_prenom VARCHAR(35) NOT NULL);
    • Depuis la version 4.1, MySQL a un introduit le type SERIAL en tant qu'alias pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
    • En cas d'usage de SERIAL associé à une clé primaire, il faut utiliser le type BIGINT UNSIGNED pour typer les clés étrangères pointant dessus.
  • PostgreSQL (2 possibilités) :
    • via la clause DEFAULT et de la fonction nextval()
    • via le type de colonne SERIAL : génère une séquence dont le nom est de la forme nomTable_nomColonne_seq, automatise l'attribution d'une nouvelle clé
    CREATE TABLE etudiant (
      etud_id SERIAL PRIMARY KEY,
            -- équivalent à :
            -- etud_id int DEFAULT nextval('etudiant_etud_id_seq')
      etud_nom VARCHAR(50) NOT NULL,
      etud_prenom VARCHAR(35) NOT NULL);
    
    --NOTICE:  CREATE TABLE will create implicit sequence "etudiant_etud_id_seq" for serial column "etudiant.etud_id"
    --NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "etudiant_pkey" for table "etudiant"
    
  • Oracle 11g: obligation de passer par un trigger... (version disponible sur ust-infoserv)
  • Oracle 12c : accepte la pseudo-colonne nextval d'une séquence en valeur par défaut
    CREATE SEQUENCE seq_etudiant;
    
    CREATE TABLE etudiant (
      etud_id INTEGER DEFAULT seq_etudiant.nextval PRIMARY KEY,
      etud_nom VARCHAR(50) NOT NULL,
      etud_prenom VARCHAR(35) NOT NULL);
    
  • Depuis Oracle 12c : introduction de l'option GENERATED [ALWAYS | BY DEFAULT] AS IDENTITY
    • ALWAYS impose l'automatisation systématique de la valeur de la colonne
    • BY DEFAULT autorise l'insertion manuelle de la valeur de la colonne
    • Utilise une séquence interne cachée (nom de la forme ISEQ$$123456)
    • Exemple :
      CREATE TABLE Professeur (
          prof_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
          prof_nom VARCHAR(30) NOT NULL,
          prof_prenom VARCHAR(20) NOT NULL,
          prof_tel CHAR(10),
          prof_adresse VARCHAR(80),
          prof_statut VARCHAR(10) NOT NULL
              CHECK (prof_statut IN ('MCF', 'PU', 'PRAG', 'ATER'))
      );