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 :

INSERT à une position donnée


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Par défaut INSERT à une position donnée
    Bonjour tout le monde,

    mon problème est le suivant :

    J'ai une table "personne" avec les champs (nom,age) et qui contient les enregistrements :
    ((toto,25);(tata,21);(titi,20))

    J'aimerais juste pouvoir insérer un enregistrement après (tata,21).
    Y a-t-il un moyen pour insérer à un emplacement qu'on choisit nous-même et non de laisser au système insérer à la fin de la table ?

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de misterdi
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut
    Salut,

    Théoriquement la position est attribuée doffice par le SGBD, et en plus en relationnel on ne travaille qu'avec des ensembles donc il n'y a pas de notion d'ordre (un même SELECT peut te renvoyer les mêmes tuples mais dans un ordre différent). Pour avoir toujours le même ordre (croissant ou décroissant), tu dois mettre la clause ORDER BY dans ton SELECT.

    En pratique on peut définir des politiques de remplissage pour un SGBD mais là il te faudra quelqu'un avec plus d'expérience que moi
    En plus ça dépend du SGBD que tu uitilise.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Par défaut
    Merci pour ta réponse,

    j'utilise Mysql comme SGBD... à mon avis ça ne change pas grand chose pour le problème posé! N'empêche que j'étais tout à l'heure on m'a dit sur le Chat qu'il faudrait passer par des triggers ou des vues ?!

    Je vais voir et s'il y a du nouveau je ferai signe.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 71
    Par défaut
    Le plus simple est encore de modifier le modèle de ta table:
    Ajouter une colonne "ordre" à ta table "personne"
    Tes enregistrements deviendraient donc
    ((toto,25,1);(tata,21,2);(titi,20,3))
    Et si tu souhaites insérer un ligne juste après tata, tu peux le faire en 2 commandes:
    1. on décale l'ordre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update personne set ordre=ordre+1 where ordre > 2;
    2. on insère la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into personne ('tete',78,3);

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 009
    Billets dans le blog
    6
    Par défaut
    Votre demande farfelue est impossible et n'a d'ailleurs aucun intérêt.
    Lisez ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro?ti..._sont_des_ense

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 71
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Votre demande farfelue est impossible et n'a d'ailleurs aucun intérêt.
    Je ne suis pas vraiment d'accord avec vous...
    Effectivement, maîtriser l'endroit exact où est insérer une ligne n'a aucun sens... Par contre, avoir la possibilité d'ordonnancer les lignes en a souvent...

    Supposons un modèle représentant différentes étapes d'un processus. Ces étapes ont généralement un ordre d'exécution plus ou moins prédéfini, il est donc souvent intéressant d'avoir la possibilité d'insérer de nouvelles étapes à une position donnée... Donc de "maîtriser" la position où est insérée la ligne. C.Q.F.D ^^

  7. #7
    Membre confirmé Avatar de misterdi
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut
    Un moyen d'accélérer l'exécution de la requête serait de créer un INDEX sur le champ utilisé pour le tri, mais il faut alors quand même créer ce champ si il n'existe pas déjà (dans l'exemple, les personnes sont classées par ordre décroissant d'âge (?)) et de toute façon ajouter la clause ORDER BY (ASC ou DESC) dans le SELECT.

    Citation Envoyé par zakaria84 Voir le message
    N'empêche que j'étais tout à l'heure on m'a dit sur le Chat qu'il faudrait passer par des triggers ou des vues ?!
    Tu peux créer une vue effectivement qui ne serait rien d'autre qu'un SELECT, mais à priori tu exécuterais alors des SELECT sur une vue triée mais je pense que rien ne garanti que tu ai toujours des données triées après ce SELECT. (Comme la souligné SQLpro il n'y a pas de notions d'ordre "normalement" dans les SGBD(-Relationnels) car ils reposent sur la théorie des ensembles).

    Donc le plus simple reste de mettre un ORDER BY dans la clause SELECT que tu éffectueras sur ces données.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 406
    Par défaut
    Merci à tous pour vos réponses,

    Je suis d'accord, et je l'avoue, que je dois revoir la conception de la base.
    Cependant mon objectif était d'éviter toute intervention sur sa structure.
    J'ai cherché un peu partout, et surtout dans la doc très complète du site officiel de Mysql, et pour l'instant aucun élément de réponse car, comme vous me l'aviez dit, c'est le moteur de base qui "insère automatiquement à la dernière position" en quelque sorte donc, pour arriver à mes fins, je dois intervenir sur le moteur même de Mysql !!!

    (Pour plus de précisions, j'utilise Mysql/PHP)

    Merci pour vos réponses.

  9. #9
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Non, je ne pense pas que tu vas réécrire le SGBD...
    Tu es sûr que tu ne veux pas nous dire ce que tu cherches à faire ?

    Parce que si jamais tu te disais qu'en faisant ça, tu allais faire ensuite
    et te baser sur l'ordre de sortie sans order by, TU TE PLANTES !

    (comme tout le monde te le dit depuis des posts et des posts, tu n'as absolument pas la main sur ce qui se passe physiquement, et c'est contre le principe du SQL).

  10. #10
    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
    J'aime les réponses de SQLPro !

    Bon, revenons à ce que tu sembles vouloir faire...
    Citation Envoyé par zakaria84 Voir le message
    J'ai une table "personne" avec les champs (nom,age) et qui contient les enregistrements :
    ((toto,25);(tata,21);(titi,20))

    J'aimerais juste pouvoir insérer un enregistrement après (tata,21).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO personne(nom, age)
    VALUES('tutu', 23)
    Tu as donc maintenant la table ((toto,25);(tata,21);(titi,20);(tutu,23)).
    Tu la veux triée par âge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM personne
    ORDER BY age
    Ci-dessus en ordre croissant d'âge. Si tu veux en ordre décroissant c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    ORDER BY age DESC
    Ne te complique pas la vie pour rien !
    A moins que tu aies envie de perdre 20 à 30 ans de ta vie ?
    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 !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/01/2006, 19h39
  2. Inserer du texte à une position donnée dans un Memo
    Par bassim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/11/2005, 18h45
  3. Writeln à une position donnée
    Par loran4444 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 12h33
  4. Réponses: 2
    Dernier message: 07/07/2005, 12h47
  5. Réponses: 2
    Dernier message: 26/05/2004, 18h53

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