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

  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 010
    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 010
    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 Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Encore une fois, non, la maitrise de la position de l'insertion d'un tuple est du ressort exclusif du moteur SGBD, c'est celle de la recupération qui est du devoir du client.
    Dans un sac de billes multicolores, vous n'y inserez pas les billes rouges avant les billes bleues pour pouvoir les sortir dans cet ordre, c'est au moment ou vous voulez les sortir que votre mecanisme de tri va se mettre en place.
    L'important est d'avoir choisi une bonne colonne de tri et de la valoriser correctement lors de l'insertion.

    Bon courage

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Je ne suis pas vraiment d'accord avec vous...
    Vous le pouvez, cela ne me gène pas.
    En revanche vous aurez du mal à ne pas être d'accord avec ce que fait un SGBDR. Sinon, revenez aux fichiers Cobol, et laissez les SGBDR tranquille !

    Si vous voulez un ordre particulier à vous de l'implanter en rajoutant à votre table une colonne pour ce faire.

    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/ * * * * *

  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
    Nooooon !
    Je suis d'accord avec Sensei.f : Yanika_bzh, SQLPro, arrêtons l'hypocrisie.
    Si le SQL se limite à la vision ensembliste, on n'arrête les order by, les fonctions analytiques, ...
    D'ailleurs petite parenthèse : la notion de séquence est également définie purement à partir des ensembles.
    Soit {a, b, c, d} un ensemble.
    On définit la séquence [b, d, c, a] par l'ensemble des 4 ensembles :
    {{b}, {b, d}, {b, d, c}, {b, d, c, a}}

    Bon, plus sérieusement, vous ne pouvez vraiment pas vous imaginez qu'on puisse avoir envie de créer un ordre sur ses données ?
    La question qu'on peut se poser par exemple : pour quel raison cherche-t-il a changer l'ordre physique ?

    Je pense comme Sensei.f que zakaria84 a mal exprimé son besoin, et qu'il l'a également mal modélisé.

    [EDIT]
    Après la réponse de SQLPro, j'insiste : je ne suis pas sûr que zakaria84 veuille changer la gestion physique des données pour le plaisir, et que son besoin est peut être légitime mais mal exprimé...

    SQLPro : regarde le post plus haut du sensei : l'ajout de colonne pour maîtriser l'ordre est la première suggestion qu'il a faite...

  10. #10
    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
    Si vous voulez un ordre particulier à vous de l'implanter en rajoutant à votre table une colonne pour ce faire.

    A +
    C'est bien la solution que je lui proposais

    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 ?
    Donc non, pas dans l'absolu, mais on peut y arriver par un autre mécanisme...

  11. #11
    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.

  12. #12
    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.

  13. #13
    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).

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Heureusement comme MySQL est un produit récent et finalement bien moins complet qu'Oracle ou SQLServer, je pense que la ré écriture à ta sauce du moteur ne devrait pas t'occuper plus de 20 à 30 années hommes.

    Bon courage !

    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/ * * * * *

  15. #15
    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 !

  16. #16
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Nooooon !
    Je suis d'accord avec Sensei.f : Yanika_bzh, SQLPro, arrêtons l'hypocrisie.
    Si le SQL se limite à la vision ensembliste, on n'arrête les order by, les fonctions analytiques, ...
    D'ailleurs petite parenthèse : la notion de séquence est également définie purement à partir des ensembles.
    Soit {a, b, c, d} un ensemble.
    On définit la séquence [b, d, c, a] par l'ensemble des 4 ensembles :
    {{b}, {b, d}, {b, d, c}, {b, d, c, a}}

    Bon, plus sérieusement, vous ne pouvez vraiment pas vous imaginez qu'on puisse avoir envie de créer un ordre sur ses données ?
    La question qu'on peut se poser par exemple : pour quel raison cherche-t-il a changer l'ordre physique ?

    Je pense comme Sensei.f que zakaria84 a mal exprimé son besoin, et qu'il l'a également mal modélisé.

    [EDIT]
    Après la réponse de SQLPro, j'insiste : je ne suis pas sûr que zakaria84 veuille changer la gestion physique des données pour le plaisir, et que son besoin est peut être légitime mais mal exprimé...

    SQLPro : regarde le post plus haut du sensei : l'ajout de colonne pour maîtriser l'ordre est la première suggestion qu'il a faite...
    Ce n'est en aucun cas de l'hypocrisie ...
    Je suis tout a fait d'accord qu'on veuille definir une notion d'ordre sur ses données, mais ceci n'est pas le pb du moteur de votre SGBD !!! C'est le votre, en y inserant une donnée qui pourra definir votre sequence.
    Dans mon exemple de sac de billes multicolores, ajoutez sur chaque bille un sticker contenant le N° d'ordre que vous inserez et vous aurez votre sequence, mais c'est toujours lors de votre recuperation de données que vous ferez ce tri, jamais dans le sac de billes ...
    Un SGBD n'est pas FIFO ou FILO

    Bon courage

  17. #17
    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
    Salut à toutes et à tous,

    bon, j'ai marqué que le sujet est résolu même si je n'ai pas pu trouvé une solution adéquate et surtout élégante au problème. Ainsi, je vais essayer de voir côté environnement de programmation si je peux arriver à insérer/afficher comme je l'espère.

    Donc, pour moi le sujet est résolu vu que, d'après les posts, ma vision des choses était fausse car SQL gère les lignes d'enregistrement comme ensembles non liés même s'ils sont définis au sein d'une même structure (table).

    Merci encore et à plus!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/01/2006, 18h39
  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, 17h45
  3. Writeln à une position donnée
    Par loran4444 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 11h33
  4. Réponses: 2
    Dernier message: 07/07/2005, 11h47
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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