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

 MySQL Discussion :

Insérer une ligne entre deux lignes


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 16
    Points : 15
    Points
    15
    Par défaut Insérer une ligne entre deux lignes
    Bonjour
    J'aimerais pouvoir insérer une ligne entre deux lignes dans une table

    par exemple a chaque enregistrement je place un chiffre croissant dans une colonne de la table:

    1 a la premiere ligne
    2 a la deuxieme
    3 a la troisieme
    4
    5 etc...

    Est il possible d'insérer, par exemple une ligne aprés la ligne 2, de lui donner le chiffre 3 et que le chiffre de toutes les lignes suivantes s'incrémentent de 1 ?

    Tout cela pour me permettre d'afficher les enregistrements avec order by ma_colonne asc

    J'ai essayé avec une colonne avec l'attibut auto_increment mais ça ne fonctionne pas :-(

    Voila, merci de vos conseils

    Mathieu

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Avant tout il faut bien se représenter une table comme un sac de billes, chaque bille nouvelle ou ancienne représentant une ligne de la table.
    Il n'y a donc pas d'ordre a priori, sauf ceux décrits dans le schéma de la table sous formes d'index simples, composés, uniques ou multiples auto-incrémentés.
    La notion de suivant ou précédent, premier ou dernier doit donc se rattacher à un index.
    Et mettre à jour un index, du type de celui décrit, par insertion et décalage doit pouvoir s'opérer via un trigger sur événement ON INSERT, mais peut s'avérer une opération assez lourde en fonction de la volumétrie de la table.
    Il faudrait par ailleurs penser éventuellement à gérer les suppressions de lignes avec ON DELETE, si l'on ne veut pas de "trou" dans la continuité et il en va de même pour les UPDATE.
    Bref, ça risque d'être assez lourd à gérer. Il me semble souhaitable de réfléchir à une autre solution pour obtenir ce classement, quitte à mettre la table en auto-non-équijointure pour effectuer ce comptage.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci pour ce conseil Kris

    je ne connais pas bien le trigger mais il me semble qu'un trigger se metrait en oeuvre a chaque INSERT et pas uniquement pour un insert entre deux lignes.

    Dans mon idée ce n'est pas grave qu'il y ai des trous dans la suite de chiffre du moment que cela permet l'affichage dans l'ordre croissant.

    Je cherche a savoir s'il existe une requete du genre:
    UPDATE ma_table SET ma_colonne+1 AFTER ma_colonne VALUE='2'

    ou bien y at'il un moyen de modifier (ajouter 1) la valeur de toutes les lignes a partir d'une ligne donnée ?

    Mathieu

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Si tu sais quel numéro d'ordre tu dois insérer, tu peux faire, avant l'insertion, un UPDATE augmentant de 1 toutes les lignes à partir de la place occupée par la nouvelle ligne.

    Si tu veux insérer l'élément n° 24, tu ferais par exemple ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    -- Incrémentation de tous les numéros à partir de 24
    UPDATE ma_table
    SET ma_colonne = ma_colonne + 1
    WHERE ma_colonne > 23;
     
    -- Insertion de la nouvelle ligne
    INSERT INTO ma_table (ma_colonne, les_autres_colonnes_impactées)
    VALUES (24, 'les_autres_valeurs_à_alimenter');
    Tu peux mettre ces deux requêtes dans un TRIGGER ON INSERT.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Bonjour,

    La notion d'ordre de lignes dans un SGBD n'existe pas.
    Il faut considérer que les lignes sont rangées dans la table comme les billes sont rangées dans un sac. Très rapidement, on ne sait plus quelle bille a été placée là avant l'autre.

    Donc, si tu as besoin d'un ordre sur les lignes, selon quel critère définis-tu cet ordre ? Si c'est à l'insertion par un langage de programmation (type PHP), c'est à ce langage de remplir et mettre à jour la colonne ORDRE.

    Peux-tu donner un peu plus d'éclaircissement sur tes critères d'ordre ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci, cinePhil
    ta solution me convient :-) mais le trigger on insert ne va convenir car la plus part du temps l'insertion se fera en bout de table et seulement occasionnellement entre deux lignes existantes.


    L'ordre dans lequel les enregistrements searont placés dans la table ne devrait pas être important, ce qui compte pour ce cas précis c'est l'affichage avec probablement order by ma_colonne asc.
    ma_colonne ayant comme attribut: INT
    Tout cela ecrit en php

    merci ced

    Mathieu

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si tu sais quel numéro d'ordre tu dois insérer, tu peux faire, avant l'insertion, un UPDATE augmentant de 1 toutes les lignes à partir de la place occupée par la nouvelle ligne.
    Je m'interroge, si cette colonne est en index UNIQUE, le UPDATE ... SET lacolonne=lacolonne+1 risque de se faire jeter pour violation de contrainte, l'index lacolonne+1 risquant d'être déjà présent dans la table, non ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Insérer une ligne entre deux autres dans un fichier
    Par c1malabar dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2011, 19h44
  2. Réponses: 5
    Dernier message: 12/11/2010, 09h45
  3. Tracer une ligne entre deux DIV
    Par akrogames dans le forum jQuery
    Réponses: 1
    Dernier message: 04/05/2009, 20h29
  4. [Dojo] Tracer une ligne entre deux DIV
    Par Invité dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 04/03/2009, 00h54
  5. Réponses: 5
    Dernier message: 01/12/2008, 14h20

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