Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
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 14/03/2010, 17h41   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 50
Points : 12
Points : 12
Par défaut [MySQL] INSERT IF NOT EXISTS

Bonjour à tous,

Comme l'intitulé l'indique, je suis à la recherche d'une requête SQL me permettant d'insérer une ligne dans une table sous réserve de certaines conditions, ou plus exactement une condition.

Je m'explique au travers d'un exemple. Soit la table 'test' suivante :

Code :
1
2
3
4
5
6
7
8
+----+------+------+
| id | text | num  |
+----+------+------+
|  1 | toto |   12 |
|  2 | tata |   15 |
|  3 | titi |   15 |
|  4 | tutu |   32 |
+----+------+------+
La clé primaire de cette table est 'id' et est 'auto_increment'.

Je souhaite pouvoir insérer dans cette table une nouvelle ligne si et seulement si le champ 'text' que je souhaite insérer n'existe pas déjà !

exemple :
Code :
INSERT INTO test (id,text,num) VALUES (NULL,"toto",20) WHERE NOT EXISTS (SELECT id FROM test WHERE text = 'toto');
Après recherches, je ne parviens pas à trouver comment faire... si quelqu'un peut m'aider... merci !
Iloyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2010, 22h42   #2
Membre du Club
 
Inscription : mars 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 51
Points : 53
Points : 53
Tu mets déjà une contrainte d'unicité sur le champs text.

Ensuite tu fais des INSERT IGNORE INTO

Et ils échouront si la clause d'unicité préalablement posée les en empêchent
yabyab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 08h42   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 50
Points : 12
Points : 12
La table est déjà existante et je ne peux pas modifier sa structure !!
Iloyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 12h55   #4
Membre actif
 
Inscription : juillet 2007
Messages : 135
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 135
Points : 150
Points : 150
essaie ceci

Code :
1
2
3
4
5
 
INSERT INTO test (id,text,num) 
SELECT DISTINCT NULL,"toto",20 
FROM test 
WHERE text <> 'toto'
teach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 13h00   #5
Membre du Club
 
Inscription : mars 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 51
Points : 53
Points : 53
Citation:
Envoyé par Iloyo Voir le message
La table est déjà existante et je ne peux pas modifier sa structure !!
On peut ajouter une contrainte d'unicité sur un table existante, ce n'est pas un problème.

De toute façon, tu veux une unicité sur le champs "text", donc tu lui mets une contrainte UNIQUE, c'est tout ...

Une autre solution serait du bidouillage :s
yabyab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2010, 13h09   #6
ced
Rédacteur/Modérateur
 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 778
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 778
Points : 6 213
Points : 6 213
Citation:
Envoyé par Iloyo Voir le message
Après recherches, je ne parviens pas à trouver comment faire... si quelqu'un peut m'aider... merci !
Tout bêtement parce que ce que tu souhaites faire, ce n'est pas possible...
La contrainte d'unicité peut être une alternative, ou alors c'est au code applicatif qui crée l'insertion de vérifier si la valeur existe déjà, mais en SQL direct, avec toutes les contraintes que tu donnes, tu ne peux pas.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2010, 13h33   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 50
Points : 12
Points : 12
Bon alors finalement j'essaye quelque chose de ce style :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DELIMITER //
	CREATE FUNCTION service_exist(s VARCHAR)
	  RETURNS INT(11)
 
	  BEGIN
		IF (SELECT count(*) FROM urls WHERE text = s) = 0 THEN	RETURN 0;
		ELSE RETURN 1;
		END IF;
	  END //
DELIMITER ;
 
IF service_exist("toto") = 0 THEN INSERT INTO urls (id,text,num) VALUES (NULL,"toto",10);
Le tout étant dans un fichier ".sql". Cependant, lors de l'utilisation de mon fichier, j'obtiens les erreurs suivantes :

Code :
1
2
3
4
5
DB Error : */ DELIMITER // CREATE FUNCTION service_exist(s VARCHAR) RETURNS INT(11) BEGIN IF (SELECT count(*) FROM urls WHERE text = s) = 0 THEN RETURN 0; [nativecode=1064 ** You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near '*/ DELIMITER // CREATE FUNCTION service_exist(s VARCHAR) RETURNS INT(11) ' at line 1]
DB Error : ELSE RETURN 1; [nativecode=1064 ** You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'ELSE RETURN 1' at line 1]
DB Error : END IF; [nativecode=1064 ** You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'END IF' at line 1]
DB Error : END // DELIMITER ; [nativecode=1064 ** You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'END // DELIMITER' at line 1]
DB Error : IF service_exist("toto") = 0 THEN INSERT INTO urls (id,text,num) VALUES (NULL,"toto",10); [nativecode=1064 ** You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'IF service_exist("toto") = 0 THEN INSERT INTO urls (id,text,num) VALUES (NULL,"t' at line 1
Je ne m'y connais pas suffisamment en SQL... si quelqu'un pouvait m'aider, ce serait avec grand plaisir !

Merci !
Iloyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 15h26   #8
ced
Rédacteur/Modérateur
 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 778
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 778
Points : 6 213
Points : 6 213
Citation:
Envoyé par Iloyo Voir le message
Le tout étant dans un fichier ".sql".
Ça, c'est un élément nouveau ?
Plutôt que de galérer avec un trigger, pourquoi ne pas insérer le contenu du fichier dans une table temporaire et ensuite faire l'insertion via un INSERT... SELECT... sur cette table temporaire en éliminant, par jointure externe dans la partie SELECT, les données déjà présentes ?
Ça fait un peu moins "massue pour écraser une mouche", non ?

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 05h39.


 
 
 
 
Partenaires

Hébergement Web