Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 17h41   #1
Membre habitué
 
Avatar de Alvaten
 
Homme
Étudiant
Inscription : novembre 2006
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : Suisse

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

Informations forums :
Inscription : novembre 2006
Messages : 169
Points : 143
Points : 143
Par défaut Insertion avec condition d'existence

Bonjour à tous,

J'essaie d'écrire une requête qui me permettrait d'ajouter une ligne dans une table seulement si elle n'existe pas déjà.

J'ai donc opté pour l'instruction IF / THEN / ELSE mais impossible de la faire fonctionner, le SGBD me donne une erreur de syntaxe.

J'ai écrit la requête suivante :
Code :
1
2
3
4
5
6
7
8
9
10
IF (
   SELECT COUNT(*)
   FROM country 
   WHERE country = 'Switzerland'
   > 0)
THEN(
   INSERT INTO country(country)
   VALUES('Switzerland')
)
END IF;
NB : J'utilise mySQL 5.1.49

Si quelqu'un pouvait me mettre sur une piste ça m'aiderait beaucoup,

Merci d'avance,

Alvaten
Alvaten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h56   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

as tu pense a utiliser le EXISTS (en fait NOT EXISTS) ?


au fait, l'erreur de syntaxe est du


Citation:
IF (
SELECT COUNT(*)
FROM country
WHERE country = 'Switzerland'
> 0)
THEN(
INSERT INTO country(country)
VALUES('Switzerland')
)
END IF;
mettre un HAVING
Code :
1
2
3
4
5
6
7
8
9
10
11
 
IF (
   SELECT COUNT(*)
   FROM country 
   WHERE country = 'Switzerland'
   HAVING Count(*) > 0)
THEN(
   INSERT INTO country(country)
   VALUES('Switzerland')
)
END IF;
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h56   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

pour éviter votre erreur de syntaxe, il faudrait ecrire votre requete ainsi :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
IF (
   (SELECT COUNT(*)
   FROM country 
   WHERE country = 'Switzerland')
   > 0)
THEN(
   INSERT INTO country(country)
   VALUES('Switzerland')
)
END IF

Et si j'en crois la logique, ce serait plutot un "<>" et non un ">"

Mais cette requête sera plus performante (inutile de compter le nombre total d'occurrences, il suffit de savoir s'il y en a (une) ou pas !)


Code SQL :
1
2
3
4
5
6
7
8
 
IF NOT EXISTS (
    SELECT *
    FROM country
    WHERE country = 'Switzerland'
)
INSERT INTO  country(country)
VALUES('Switzerland')



D'autre part, placez une contrainte d'unicité sur country...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h14   #4
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Juste pour rigoler, si ton but est bien d'insérer seulement si n'existe pas :

Code :
1
2
3
4
5
6
7
 
INSERT INTO COUNTRY(country)
SELECT 'Switzerland'
FROM (SELECT count(*) nb
          FROM COUNTRY
          WHERE country = 'Switzerland') cnt
WHERE nb = 0
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h45   #5
Membre habitué
 
Avatar de Alvaten
 
Homme
Étudiant
Inscription : novembre 2006
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : Suisse

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

Informations forums :
Inscription : novembre 2006
Messages : 169
Points : 143
Points : 143
Merci pour vos réponses.

@dehorter olivier: Ta solution ne fonctionne pas, j'ai toujours une erreur de syntaxe sur le IF, pour le exists je l'avais testé mais pas moyen de le faire fonctionner mieux

@aieeeuuuuu: Vos solutions me donnent aussi une erreur de syntaxe sur le IF, pourtant il devrait être compatible avec ma version de mySql (v5+), pour le "<>" c'est exact, j'ai du écrire trop vite.

@pacmann: Impeccable, c'est exactement ça, et ça marche sur SGBD. Par contre serait-il possible de me donner une courte explication ? Je comprend bien la requête imbriquée mais pas trop le INSERT INTO / SELECT
Alvaten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 10h19   #6
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
En fait, j'essaie toujours de faire le code le plus incompréhensible pour les autres.

Comme ça, quand je me fais virer, c'est le retour de baton.

... nan je déconne, mais il est vrai que la solution est plus une astuce qu'autre chose.

- Tu insères le résultat d'un SELECT. C'est la syntaxe qui te permet d'insérer dans les tables les lignes obtenues à partir d'une autre requête.

Code :
1
2
3
 
INSERT INTO COUNTRY(country)
SELECT ...
- Tu aimerais ne réaliser l'insertion que si un certain count(*) vaut 0.
Donc tu considères le résultat de count(*) comme une table à une ligne et une colonne, et tu sélectionnes toutes les lignes pour lesquelles count(*) vaut 0 ! (si count(*) vaut 0 : une ligne retournée, sinon 0)

Code :
1
2
3
4
5
6
 
SELECT 'Switzerland'
FROM (SELECT count(*) nb
          FROM COUNTRY
          WHERE country = 'Switzerland') cnt
WHERE nb = 0
=> Lorsqu'une ligne est retournée, tu sélectionnes la constante 'Switzerland' pour l'insertion

(J'espère que c'est un peu plus clair)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 13h53   #7
Membre habitué
 
Avatar de Alvaten
 
Homme
Étudiant
Inscription : novembre 2006
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : Suisse

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

Informations forums :
Inscription : novembre 2006
Messages : 169
Points : 143
Points : 143
C'est très clair merci beaucoup, j'ai pu écrire les requêtes concernées et ça marche impeccable.
Alvaten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 10h11   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Pacman vous à donné une bonne requête, mais sur le long terme elle sera catastrophique en terme de performances, car pour exécuter les COUNT(*) de la sous requête il faut verrouiller la table entière !
Le plus simple est donc d'utiliser le NOT EXISTS :

Code :
1
2
3
4
5
INSERT INTO COUNTRY(country)
SELECT 'Switzerland'
WHERE NOT EXISTS(SELECT 0
          FROM COUNTRY
          WHERE country = 'Switzerland');
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h59   #9
Membre habitué
 
Avatar de Alvaten
 
Homme
Étudiant
Inscription : novembre 2006
Messages : 169
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : Suisse

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

Informations forums :
Inscription : novembre 2006
Messages : 169
Points : 143
Points : 143
Merci de cette précision.

Après un test de votre requête, il s'avère qu'elle donne aussi une erreur de syntaxe sur le where. L'abscense de clause FROM est elle permise ?
Alvaten est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h50.


 
 
 
 
Partenaires

Hébergement Web