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 :

Update sql, avec une table à deux colonnes ...


Sujet :

Langage SQL

  1. #1
    dcz
    dcz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 29
    Points : 12
    Points
    12
    Par défaut [Résolu] Update sql, avec une table à deux colonnes ...
    Bonjour,

    j'ai une table définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE table (
    		config_name varchar(255) NOT NULL,
    		config_value varchar(255) NOT NULL, 
    		PRIMARY KEY config_name (config_name)
    		);
    Et j'aimerais savoir s'il existe une façon d'updater plusieurs valeurs en une seule requète sur ce type de table.

    Soit sans passer par une requète par valeur avec une requète du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		$sql = "UPDATE table 
    			  SET config_value = '$value'
    			  WHERE config_name = '$name'";

    Parrallement je me demande si une meilleur definition de table ne conviendrait pas mieux à mon usage.

    L'idée est d'utiliser cette table pour des valeurs de configuration d'un module, et d'en profiter pour y stocker quelques statistiques, cela evite une requète sur une eventuelle autre table en entrée de code (en plus mes stats ne concernent que 6 valeurs), mais j'aimerais trouver un moyen pour que l'update nécéssaire à chaque utilisation (à cause du comptage) soit lui aussi fait en une requète.

    Je me demande si une table ayant autant de colonnes que de valeurs et une seule ligne ne serait pas plus adapté ?

    En tous cas, merci à celui qui me donnera un indice.

    ++

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    première remarque en passant, si tu envisage sérieusement d'appeller une de tes tables Table, il vaut mieux rectifier ceci rapidement (cf Les mots-clé reservés du SQL)

    Pour ta première question, il est possible d'affecter plusieurs lignes via un UPDATE si les mises à jour sont "génériques" :

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE maTable
       SET config_value = config_name;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE maTable
       SET config_value = '1';
    Mais dans ton cas, si les valeurs sont des paramètres bien distincts les uns des autres, j'ai peur qu'il te faille faire un UPDATE par paramètre.


    En ce qui concerne ta deuxième question : si ta table est prévue pour recevoir des paramètres divers, il est bien entendu formement conseillé de les gérer ... comme tu le fais actuellement.
    En effet, imagine que tu as 6 paramètres, et que tu te décides à les gérer via un seul enregistrement à 6 colonnes. le jour où les besoins changent, et que tu dois gérer de nouveaux paramètres, tu es obligé de modifier la structure de ta table : pas très évolutif
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    dcz
    dcz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse.

    Et tinquiète ma table ne s'appelle ni ne s'appelera table, je prendrais un autre nom générique la prochaine fois

    Donc, c'est bien ce qu'il me semblait, pas moyen d'eviter une requète par paramètre.

    Je sais que l'alternative que je propose est un peut "lourde", mais pas si impossible a faire evoluer que ça, on peut toujours ajouter des colonnes si on veut (elle ne ferait qu'une ligne de toute façon c'est pas les grands travaux).
    Mon souci est ici la rapidité avant tout, et je me dis qu'il vaut mieux une table d'une seule ligne finallement, plutôt qu'une du type que j'évoquais ou même que deux table distinctes (une pour la config et une pour les stats rapides).

    Vu que les paramètres à mettre à jour à chaque lancement du script sont somme toute peut nombreux, 9, et je ne pense pas aller au dessus de 12 (autrement j'ajouterais une autre table ).

    Qu'en penses tu, une table d'une ligne et uns vingtaine de colonnes, modifs eventuelles de structure mise à part, ce qui donne une requète en entrée, puis une en sortie, c'est plus rapide que deux requètes en entrée et une en sortie sur deux tables, la première pour la config (au passage il faut du coup un ti while pour agencer le tableau des resultats pour l'exemple cité) et la deuxieme pour les stats ?

    Je me dis que oui, mais j'oublie sûrrement un paramètre ou deux pour bien me rendre compte.

    ++

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    J'en dis que :
    Mon souci est ici la rapidité avant tout
    Tu n'as pas à t'inquiéter pour les performances : vu le faible volume de données gérées, quelle que soit la solution que tu choisisses, ça ne posera aucun souci ... à moins que tu parles de rapidité de codage ?

    Du côté du modèle, je n'en démords pas : un enregistrement par paramètre, avec un code et une valeur, c'est le meilleur modèle à mon sens, puisque plus évolutif.
    Imagine que tu les rendes accessible via un tableau et qu'on te demande de les classer, par ordre ou via un champ de type "famille" par exemple : avec le modèle que tu as actuellement, il te suffirait de rajouter une colonne pour gérer cette nouvelle notion. Avec le modèle à un seul enregistrement, comment vas-tu faire ? Tu vas dupliquer toutes tes colonnes ?
    De plus, même si j'ai dis que les perfs n'étaient pas un souci, quand tu lis ou tu mets à jour un seul paramètre, il sera beaucoup plus rapide de manipuler un seul champ en y accédant via son code que de manipuler un enregistrement qui fait 10-15 colonnes.

    Maintenant tu fais comme tu le sens
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  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
    21 768
    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 : 21 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Contrairement à ce qui t'a été dit, il est parfaitement possible de mettre à jour plusieurs lignes distinctes...

    Il suffit pour cela d'un peu d'imagination.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE Ma_table 
    SET config_value =
        CASE  config_name
           WHEN 'toto' THEN 'A'
           WHEN 'titi' THEN 'B'
        END
    WHERE config_name IN ('A', 'B')
    De plus ton modèle est bon. Faire une colonne par paramètre est stupide.
    Tu peut cepandant rajouter à ta table de paramétrage une colonne indiquant le type (alpha, nombre, date...).

    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
    dcz
    dcz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    hehe, je me demande c'est tout.

    Encore une fois je n'aurais jamais (j'ai dis jamais moi ? ) d'autres infos à prendre dans cette table, par contre, j'entends le coté selection sur 20 colonnes.

    D'un autre coté on dirait que SQLpro (bonjour ) met tout le monde d'accord. Une requète c'est le top.

    Ce que je voulais avant tout c'est eviter une rafalle de connections au serveur sql dans le code d'un script qui est tout de même censé réagir à des alertes de scans agressifs sur des sites, du coup tout gain de procedure est bon à prendre, l'envois d'une alerte peut vraiment se jouer à aussi peut je pense.

    Donc merci à vous deux, et je teste cette merveilleuse formulation de SQLpro cette AM.


    ++

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par dcz
    Donc merci à vous deux, et je teste cette merveilleuse formulation de SQLpro cette AM.
    Tu ne nous a pas précisé ton SGBD, CASE n'est pas implémenté partout :
    cf http://sql.developpez.com/sqlaz/fonctions/#L1.8.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  8. #8
    dcz
    dcz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Ah, bah c'est mysql 4 et 3 en priorité.

    D'après ce que je lis dans ton lien, c'est bon, dommage pour oracle, mais bon je pense que les utilisateurs d'oracle auront d'autres alternatives que mon script s'il peuvent financer une licence, y'aura aussi moyen de l'utiliser avec postgre apparement.

    De toute façon je teste tout cela cette am.

    Merci encore.

    ++

  9. #9
    dcz
    dcz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    Donc,
    Je viens d'essayer tout ça, et ça marche du tonnerre , bcp plus rapide qu'une serie de requètes.

    Tout à fait ce que je recherchais donc, merci encore

    ++

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

Discussions similaires

  1. [Vxi3] Problème avec une table SQL SERVER 2005
    Par ahmed_amine dans le forum Designer
    Réponses: 2
    Dernier message: 14/06/2011, 18h10
  2. Réponses: 0
    Dernier message: 02/03/2011, 23h26
  3. Réponses: 9
    Dernier message: 13/03/2010, 10h38
  4. [HQL] Update HQL sur une table avec Id composite
    Par Eccoon dans le forum Hibernate
    Réponses: 5
    Dernier message: 02/04/2007, 12h10
  5. [SQL] couper une table en deux
    Par irenee dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/03/2006, 14h59

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