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 :

Requête pour ajouter ou modifier un champ


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut Requête pour ajouter ou modifier un champ
    J'ai une question qui peut sembler stupide mais pour laquelle j'aimerais avoir la solution la plus appropriée.

    J'ai une table qui contient plusieurs colonnes, mettons A, B, C (faisons original), je dois insérer dans cette table une série de champs, tout en vérifiant que dans ces champs la colonne A n'est pas égale à une valeur déjà rentrée pour A dans ma table.

    Par exemple si j'ai:

    A : Paul
    B : Banquier
    C : Truc

    Si je veux insérer le triplet (Pierre, Pecheur,Machin), je le rajoute en second, en revanche si je veux insérer un triplet avec (Paul, Pecheur, Machin), il faut que j'update les données de Paul.

    Là où le bat blesse c'est que mes champs ne sont ni uniques ni primaires, ni rien du tout, donc je ne peux pas utiliser une syntaxe du style INSERT INTO ... ON DUPLICATE KEY ...

    J'ai bien dans l'idée de pouvoir passer par une table temporaire pour stocker mes champs et créer moi même ma petite table avec ma clé unique et donc pouvoir utiliser le DUPLICATE KEY, mais si je me retrouvais dans le cas où j'avais un bon paquet de champs à modifier/ajouter, je me dis que la solution semble un peu violente, donc je voulais savoir s'il y avait une solution plus 'out of the book'.

    Je travaille sur MySQL 4.1, mais j'aimerais une réponse un peu générique c'est pourquoi je poste ici

    Voilà j'espère avoir été clair, et ne pas avoir posé une question trop stupide, je suis pas encore très doué avec le principe de certaines requêtes, et j'avoue que je suis pas fan de bidouiller sur ma base pour trouver une solution (j'ai pas trouvé grand chose sur ces problèmes sur internet... )

    Merci pour ceux qui ont lu jusqu'ici

    (Edit: aussi sinon je cherche une bonne doc sur les procédures et fonctions en (My?)SQL pour savoir comment ça marche mici! )

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Il faut que vous testiez (par une requête SELECT) si la ligne existe avant de l'insérer.
    En fait, vous n'avez qu'à tester si la colonne A existe déjà.
    Si ce n'est pas le cas alors vous faîtes votre insertion ; dans le cas contraire, vous ne faîtes rien.

    Une alternative consisterait à effectuer ces 2 traitements en un seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO ...
    SELECT MaColA, MaColB, ...
    FROM MaTable
    WHERE NOT EXISTS ( SELECT * FROM MaTable WHERE COLA = MaColA )
    Cependant, je sais que MySQL ne supporte les sous-requêtes qu'à partir de la version 4.1 (incluse ?).

    Eventuellement, si MySQL dispose de ce mécanisme dans sa version 4.1, vous pouvez gérer une exception en utilisant une contrainte d'unicité sur votre table.

    Enfin, je vous rappelle qu'il n'existe pas d'ordre dans une table (il faut voire cette "structure" comme un sac de billes) :
    Citation Envoyé par Linio
    Si je veux insérer le triplet (Pierre, Pecheur,Machin), je le rajoute en second

  3. #3
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Là où l'intrigue se corse, c'est que je n'ai aucune possibilité de récupérer le résultat d'une requête précédente, ni la possibilité de modifier d'aucune manière la structure de la table existante (table utilisée par d'autres personnes que moi).

    Dans la solution proposée, si le champ n'existe pas, il n'est pas inséré, or je voudrais pour ma part qu'il le soit.

    Ainsi que pour la contrainte d'unicité je ne peux pas modifier ma table... (Ca complique un peu)

    Edit1: Je pense qu'il faudrait que je puisse faire 2 requêtes de type: Update If blabla, et Insert If not(blabla), une des deux ne serait pas exécutée au moins ça règle mon problème...

    Edit2: Mon cerveau est un peu embrumé Je crois en fait tout simplement que vous m'avez donné exactement la solution que je recherche pour régler mon problème, à savoir une insertion conditionnelle. Je vais voir comment mettre ça en place.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    donnez nous un exemple CONCRET en respectant la charte de postage !

    http://www.developpez.net/forums/showthread.php?t=944

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

  5. #5
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO tablePrincipale(id,rid,category) 
    VALUES (
    (SELECT id FROM tableProjets WHERE name = 'projetA') , 
    (SELECT id FROM tableUsers WHERE username = 'moi') , 
    'cat'
    ) 
    WHERE 
    NOT EXISTS (SELECT * FROM tablePrincipale WHERE cid ='IdAUnique');
    Voilà un exemple concret que je pensais ok, mais il me fait une erreur de syntaxe 1064 près de WHERE NOT EXISTS ...

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    La version 4.1 de MySQL ne doit pas gérer les sous-requêtes.
    Cherchez de ce côté et tenez-nous informé !

  7. #7
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Alors...

    Depuis la version 4.1, MySQL supporte toutes les formes de sous-requêtes et opérations que le standard SQL requiert, ainsi que quelques fonctionnalités spécifiques.
    Et après un SELECT version(); de ma base j'obtiens:

    Donc, heu... là je suis paumé...

    J'ai pas vraiment l'impression qu'on puisse faire un INSERT INTO ... WHERE ...

    Or c'est exactement ça que je veux pouvoir faire, une insertion conditionnelle...

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Dans votre citation tout le dilemme vient du fait que l'on ne sait pas si la version 4.1 est incluse ou non.
    A priori non.

  9. #9
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Si si c'est inclus, c'est sur et certain.

    Le problème réside dans le fait que je dois faire un insert into avec des valeurs fixes et non pas récupérées dans une autre table or la clause WHERE ne s'applique qu'à un SELECT.

    J'ai appris ce soir à ma grande surprise qu'on pouvait faire un SELECT 'valeur' FROM table et que cette requête renvoyait valeur. J'avoue ne pas voir l'intérêt d'un tel type de requête, mais en l'occurence je crois qu'ici réside la solution à mon problème, je mettrais à profit cet apprentissage demain en espérant pouvoir classer le sujet.

    Merci pour les pistes, je vous tiens au courant de mes avancées.

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

Discussions similaires

  1. [AC-2007] Requête pour ajouter une champ calculé à une table
    Par GroFlo dans le forum IHM
    Réponses: 2
    Dernier message: 14/02/2012, 15h51
  2. Requête pour ajouter des données
    Par parasol007 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/07/2008, 11h31
  3. [MySQL] Un seul bloc de requêtes pour récupérer et modifier le même champ
    Par Alexandrebox dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 17/04/2007, 12h13
  4. requête pour ajouter données à colonne
    Par sarah67 dans le forum Access
    Réponses: 12
    Dernier message: 21/02/2006, 11h48
  5. Requête pour récupérer le nom des champs
    Par legillou dans le forum JDBC
    Réponses: 1
    Dernier message: 08/02/2006, 16h09

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