IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Trigger pour incrémentation de champs


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Student
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Par défaut Trigger pour incrémentation de champs
    Bonjour à tous,

    Je voudrais créer un trigger qui incrémente un champ (id_groupe) dans ma base de données après une insertion car suite à une erreur dans la conception de celle-ci , elle n'est pas en auto-incrément et il m'est impossible de le rajouter étant donné qu'elle contient des enregistrements est qu'elle est relié à plusieurs table

    pouvez-vous me donner quelque piste car niveau trigger je suis pas très au point.

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Les champs sont à la campagne et les colonnes dans les tables
    Sinon, le plus simple est de passer par une table compteur, sous réserve d'avoir des performances très pourries (si vous faites un MAX à chaque fois).

    Basez-vous sur ce trigger.
    http://www.developpez.net/forums/d14...f/#post7948369

    PS : Attention, il faut bien penser trigger "statement" et non "row". On peut parfaitement insérer un lot de ligne en une seule requête.

  3. #3
    Candidat au Club
    Homme Profil pro
    Student
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Student

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Par défaut
    Merci pour la réponse Sylvain j'étais déjà tomber sur le post que vous m'avez fournis lors de ma recherche avant mon poste mais je ne savais pas que cela aurait pu être la soluce .. !

    sinon qu'entendez vous par perte de performances ? à partir de combien d'enregistrement cela peut induire sur les performance de la base ?.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Rechercher le MAX() sur une colonne peut rapidement prendre du temps, même si c'est la PK clustered.

    Après, s'il y a "quelques lignes" (on va dire moins de 10000) évidement, c'est pour ainsi dire instantané. Mais quand on arrive au million, les performances peuvent rapidement diminuer.

    Dans tous les cas, passer par une table compteur (ou une séquence, mais c'est dispo qu'à partir de SQL Server 2012) permet de conserver des performances linéaires quelle que soit la taille de la table.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Sur MySQL, on peut ajouter l'auto-incrémentation après coup.

    Je viens de tester avec quelques lignes dont le plus gros identifiant était 56 mais pas sur la dernière ligne insérée et MySQL a commencé tout seul l'auto-incrémentation à 57 sans toucher aux id existants.

    Je ne sais pas si les autres SGBD font pareil.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    MySQL est le seul à ma connaissance à fonctionner de la sorte.

    C'est aussi le seul à boucher automatiquement les trous dans une colonne auto-incrément, ou à gérer plusieurs compteur pour une même table en cas de clé composite.


    Sous Oracle, si je ne m'abuse, ça n'existe tout bonnement pas (on doit se taper les auto-incrément à la main à l'aide de triggers et de séquences).

    Et sous SQL Server, "identity" est bien plus limité en termes de fonctionnalités.

    Exemple avec SQL Server :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    drop table autonum;
    go
     
    create table autonum
    (
    	id int primary key,
    	nom varchar(10) not null
    );
    go
     
    insert into autonum (id, nom) values (1, 'toto');
    insert into autonum (id, nom) values (2, 'titi');
    insert into autonum (id, nom) values (4, 'tutu');
    go
     
    alter table dbo.autonum alter column id int identity;
    go
     
    insert into autonum (nom) values ('tata');
    go

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (1*ligne(s) affectée(s))
     
    (1*ligne(s) affectée(s))
     
    (1*ligne(s) affectée(s))
    Msg*156, Niveau*15, État*1, Ligne*16
    Syntaxe incorrecte vers le mot clé 'identity'.
    Msg*515, Niveau*16, État*2, Ligne*19
    Impossible d'insérer la valeur NULL dans la colonne 'id', table 'tempdb.dbo.autonum'. Cette colonne n'accepte pas les valeurs NULL. Échec de INSERT.
    L'instruction a été arrêtée.
    Il a pas voulu ajouter identity à ma colonne.

    Maintenant, il existe divers moyens pour pallier au problème avec SQL Server :

    Voici un exemple complet en recréant la table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    drop table autonum;
    go
     
    create table autonum
    (
    	id int primary key,
    	nom varchar(10) not null
    );
    go
     
    insert into autonum (id, nom) values (1, 'toto');
    insert into autonum (id, nom) values (2, 'titi');
    insert into autonum (id, nom) values (4, 'tutu');
    go
     
    sp_RENAME 'autonum' , 'old_autonum';
    go
     
    create table autonum
    (
    	id int primary key identity,
    	nom varchar(10) not null
    );
    go
     
    set IDENTITY_INSERT autonum on;
    insert into autonum (id, nom)
    select id, nom from old_autonum;
    set IDENTITY_INSERT autonum off;
    go
     
    drop table old_autonum;
    go
     
    insert into autonum (nom) values ('tata');
    go
     
    select * from autonum;

    Evidement, s'il y a des données liées, ça va pas être pratique.

    La solution consistant à créer une colonne identity avant de supprimer l'ancienne est pas mal aussi, au détail près qu'on ne peu pas initialiser les lignes avec l'ancienne valeur, et du coup s'il y a des tables qui font référence à cette table, marche pas non plus...

Discussions similaires

  1. Trigger sur un INSERT pour incrémenter un champ
    Par leilan dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/07/2014, 09h59
  2. [AC-2010] expression pour incrémenter un champ
    Par sebinator dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/10/2012, 12h19
  3. Trigger qui incrémente un champ
    Par Almenor dans le forum PL/SQL
    Réponses: 20
    Dernier message: 06/03/2012, 13h08
  4. [Billet Blog] Trigger pour incrémentation relative
    Par CinePhil dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 08/09/2011, 14h30
  5. Trigger Pour Afficher Le Champ D'une Table
    Par y.legouadec dans le forum Développement
    Réponses: 5
    Dernier message: 05/10/2006, 22h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo