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 :

Incrémenter champ : insert into . select max(.) + 1 from .


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 37
    Points
    37
    Par défaut Incrémenter champ : insert into . select max(.) + 1 from .
    Bonjour à tous

    Je vous explique mon cas de figure : j'ai une table de données relatives à une autre entité (typiquement, on va dire que j'ai des écritures sur un compte)
    J'ai une table compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
    numero_compte,
    ...
    )
    et une table d'écritures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (
    numero_compte,
    numero_ecriture,
    ...
    )
    le couple (numero_compte, numero_ecriture) est unique dans ma table des écritures.

    Je voudrais insérer une donnée dans ma table des écritures une écriture qui est la prochaine dans l'ordre des numero d'écriture. J'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ecriture select numero_compte, max(numero_ecriture)+1,... from ecriture where numero_compte = num1
    Le problème est que tant que mon compte n'a pas d'écriture, cette insertion ne marche pas puisque le sélect ne retourne rien. Est-ce que quelqu'un aurait une autre idée pour faire ça ? Ou pour corriger mes erreur ?

    Merci d'avance
    Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
    Bernard Werber

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Pourquoi n'utiliserais-tu pas un champ autoincrémenté ?

    Avec ta solution, que se passerait il si une première personne lance la requête, le max retourne 1 disons. Pas de commit. Une deuxième personne lance la même requête, le max retourne toujours 1. La personne 1, commite, ensuite la seconde commit. Et la tu as deux lignes avec le même numéro d'enregistrement ?


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Le problème c'est que pour des raisons internes, je dois laisser la structure de la table telle qu'elle est, sans auto-incrémentation.
    C'est dans le cadre d'une procédure de régularisation donc une seule personne accèdera aux données. Mais en tout cas, la remarque est bonne pour l'accès concurrentiel.
    Quand on utilise un autoincrement, dans le cas de figure que tu propose on est assuré de l'unicité de l'identifiant ? Les autoincrement existent sous Oracle (je vais chercher de mon côté)
    Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
    Bernard Werber

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si tu es sous oracle, comme le laisse supposer ton dernier post, et bien que la solution de lalystar soit la meilleure (avec une séquence), tu peux toujours faire nvl(max(numero_ecriture), 0)+1 (COALESCE en sql normé)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    à vrai dire, j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nvl(max(nvl(NUMERO_ECRITURE,0)),0)+1
    ... et ça ne m'insère pas d'enregistrement pour les compte n'ayant pas encore d'écriture...
    Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
    Bernard Werber

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into ecriture select numero_compte, NVL(max(numero_ecriture),0)+1,... 
    from ecriture where numero_compte (+)= num1
    GROUP BY...;
    La jointure externe permet de retourner une ligne null si aucune ligne existe

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par pgibone
    Si tu es sous oracle, comme le laisse supposer ton dernier post, et bien que la solution de lalystar soit la meilleure (avec une séquence), tu peux toujours faire nvl(max(numero_ecriture), 0)+1 (COALESCE en sql normé)
    créer une nouvelle séquence à chaque nouveau compte créé et faire du SQL dynamique on peut pas dire que ce soit des plus heureux

  8. #8
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    toujours si tu es sous Oracle, que penserais-tu d'un trigger??? par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE TRIGGER tr_incrementation_cle
    BEFORE INSERT ON ecriture
    FOR EACH ROW
    DECLARE temp INTEGER;
    BEGIN
       SELECT MAX(numero_ecriture) INTO temp FROM ecriture;
       IF temp IS NULL OR temp=0 THEN
           :NEW.numero_ecriture:=1;
       ELSE
           :NEW.numero_ecriture:=temp+1;
       END IF;
    END;
    /
    A moins que je n'ai pas compris ton problème...
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par orafrance
    créer une nouvelle séquence à chaque nouveau compte créé et faire du SQL dynamique on peut pas dire que ce soit des plus heureux
    Pô fait attention que c'était un N° par Compte, ce qui était pourtant clair
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2002
    Messages : 55
    Points : 37
    Points
    37
    Par défaut
    Merci à tous pour vos solution, la nuit porte conseil, mais un bon repas aussi En trifouillant dans tous les sens et en réfléchissant un peu je suis tombé sur la solution de OraFrance.

    Merci à tous.
    Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même...
    Bernard Werber

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et la prochaine fois... pense à poster dans le forum Oracle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2012, 12h32
  2. [AC-2003] souci utilisation de INSERT INTO- SELECT- FROM- WHERE
    Par eugene_françois dans le forum Modélisation
    Réponses: 1
    Dernier message: 16/04/2010, 17h14
  3. [Oracle 9] Anomalie insert into select
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/05/2006, 15h11
  4. probleme dans un INSERT INTO...........SELECT
    Par briiice dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/01/2006, 16h13
  5. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 18h32

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