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 IF NOT EXISTS


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 25
    Points
    25
    Par défaut INSERT IF NOT EXISTS
    Bonsoir,

    Soit la requête : INSERT INTO matable(maclefprimaire, maclefetrangere, monattribut) VALUES (1, 1, 'valeurtexte');
    Si je l'effectue sur matable vide c'est Ok. Si je l'effectue sur matable remplie (par exemple en l'effectuant 2 fois) c'est Pas Ok (violation de clef primaire).
    Quelle requête dois-je faire pour que ça fonctionne quelquesoit l'état de ma table ? Configuration : PostgreSQL v7.4 (pas de SAVEPOINT)

    a+, =)
    -=Finiderire=-

  2. #2
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par finiderire Voir le message
    matable(maclefprimaire, maclefetrangere, monattribut) VALUES (1, 1, 'valeurtexte');...
    (violation de clef primaire)...
    Bien sûr que vous ne pouvez pas : redondance de la clé primaire !

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO matable(maclefprimaire, maclefetrangere, monattribut) 
    VALUES (1, 1, 'valeurtexte')
    tu essayes d'insérer deux fois la valeur 1 dans ta cle primaire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO matable (
    select a.maclefprimaire + 1 , 1, 'valeurtexte' FROM matable a
    )
    Biensur ca ne peut marcher que si ta cle est un number !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Le but de la manoeuvre est bien d'insérer l'enregistrement (1,1,'valeurtexte') si et seulement si il n'est pas déjà présent et aucun autre enregistrement.Mon problème concerne la façon dont on exprime cela en SQL :
    -la requête INSERT INTO apporte un message d'erreur la 2nde fois (ce qui est
    -la requête INSERT IGNORE n'est pas disponible dans le SGBD que j'utilise
    Pour reprendre le titre, comment écrit-t-on un INSERT IF NOT EXISTS en SQL ?

    a+, =)
    -=Finiderire=-

  5. #5
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Salut à tous

    à mes humbles connaissances ce là ne résout pas en SQL..
    Je ne sais pas grand chose sur PostgreSQL mais je vous conseille de chercher avec son langage procédurale (comme PL/SQL chez Oracle et TSQL chez SQL Server)..

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Il te suffit d'une table bidon contenant un enregistrement (comme dual sous Oracle, ou une table quelconque sur laquelle tu sélectionnes un enregistrement et un seul).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    INSERT INTO
        matable
        (   maclefprimaire
        ,   maclefetrangere
        ,   monattribut
        ) 
    SELECT  1
        ,   1
        ,   'valeurtexte'
    FROM    tablebidon
    WHERE   NOT EXISTS
            (   SELECT  0
                FROM    matable
                WHERE   maclefprimaire = 1
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut


    cela faisait un moment que je cherchais comment cela sans passer par un PL/SQL.

    Mer ci pour l'astuce, c'est super pratique !!!!
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  8. #8
    Membre régulier Avatar de tidou95220
    Homme Profil pro
    BI junior
    Inscrit en
    Novembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BI junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2008
    Messages : 263
    Points : 90
    Points
    90
    Par défaut
    Si je suis le schema de ta requete :

    ceci devrai marcher ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO change (`currency`,`currency_echange`,`currency_country`,`code_iso`,`currency_description`) 
    SELECT 'dollar', 'dollar', 'dollar', 'dollar', 'dollar' FROM dual 
    WHERE NOT EXISTS (SELECT * FROM change WHERE change.currency = 'dollar');

  9. #9
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut


    la meilleur façon de savoir est d'essayer

    Pour ma part, je changerai cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM CHANGE WHERE CHANGE.currency = 'dollar'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT 0 FROM CHANGE WHERE CHANGE.currency = 'dollar'
    Mais à mon avis cela doit marcher
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  10. #10
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    CHANGE n'est pas un mot réservé SQL ?
    ~ Lola ~

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Je ne sais pas si c'est du standard SQL, ni si ça fonctionne avec PgSql, mais je code ce genre de requête ainsi (avec MaxDB):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO matable(maclefprimaire, maclefetrangere, monattribut) 
    VALUES (1, 1, 'valeurtexte') update duplicates
    ou
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO matable(maclefprimaire, maclefetrangere, monattribut) 
    VALUES (1, 1, 'valeurtexte') ignore duplicates
    suivant ce que je veux faire en cas de doublon.

    Tatayo.

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    jolie nécro

  13. #13
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Je ne sais pas si c'est du standard SQL, ni si ça fonctionne avec PgSql, mais je code ce genre de requête ainsi (avec MaxDB):
    Non, ce n'est pas du standard SQL
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. Selection de lignes + insertion if not exists
    Par tom741 dans le forum SQL
    Réponses: 5
    Dernier message: 20/10/2010, 16h37
  2. [MySQL] INSERT IF NOT EXISTS
    Par Iloyo dans le forum MySQL
    Réponses: 7
    Dernier message: 17/03/2010, 15h26
  3. Sunopsis ODI: Insertion if not exists
    Par Marie-Thérèse dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 06/08/2009, 10h43
  4. insert et not exists
    Par farenheiit dans le forum SQL
    Réponses: 3
    Dernier message: 10/07/2009, 16h45
  5. Insert .. where not exists
    Par Zolex dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/03/2007, 11h26

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