Page 1 sur 1
IF NOT EXISTS
Posté : 22 nov. 2010, 10:49
par Manserk
j'ai une requête :
elle fonctionne bien
maintenant j'aimerais qu'elle gère de ne pas enregistrer 2 fois la même url, donc :
elle, ne marche pas

, j'ai aussi essayé avec un s a la fin de EXIST
j'utilise pdo, en php, y a t'il une subtilité ?
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 11:27
par Manserk
j'ai aussi essayé ceci :
INSERT INTO tb_url (lbl_url) VALUES (:lien) IF NOT EXISTS(SELECT lbl_url FROM tb_url WHERE tb_url= :lien)
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 12:36
par ouckileou
"elle ne marche pas": erreur ? enregistre quand même ?
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 12:51
par MAnserk
pas d'enregistrements si les liens sont déjà dans la base ou non
j'ai l'erreur suivante :
Code : Tout sélectionner
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 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 NOT EXISTS INTO tb_url (lbl_url) VALUES ('http://www.manserk.com/')' at line 1
donc ma syntaxe n'est pas la bonne, mais je ne sais pas quelle est la bonne
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 13:03
par ouckileou
Quelle est la version de MySQL?
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 13:42
par Manserk
je suis en version 5.1.36
j'ai cherché un peu et comme solution je pense que je pourrais faire une requête select séparé avant, mais la table serra assez grosse donc je cherche a mettre ça en une seule requête
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 14:49
par ouckileou
J'ai regardé vite fait la doc et je ne suis pas sûr que ta syntaxe existe, au moins dans cette version, par contre il y a le mot clé IGNORE, peut être peux-tu regarder de ce côté :
http://dev.mysql.com/doc/refman/5.1/en/insert.html
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 15:18
par devlop78
Ton cas est plus une contrainte d'intégrité, et il serait intéressant que tu utilises la contrainte "UNIQUE" fournie par MySQL. N'oublie pas l'interclassement approprié pour ignorer la casse.
a+
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 15:21
par devlop78
Le mot clé "ignore" ne fera rien dans ce cas. Il va juste déterminé si lorsque ton insertion échoue, Mysql émettra une erreur ou pas. Si tu mets ignore et que ton insertion échoue, tu ne le sauras qu'en regardant le nombre de lignes altérées.
Re: IF NOT EXISTS
Posté : 22 nov. 2010, 15:29
par ouckileou
En fait je pensais que la contrainte était déjà présente et que c'était pour gérer le cas proprement, mais oui en effet la contrainte d'unicité serait le premier pas bien vu

Re: IF NOT EXISTS
Posté : 24 nov. 2010, 11:30
par Manserk
Bonjours, j'avance, un peu
d'abord j'ai décidé de laisser tomber le php pour faire des test directement dans mysql ça va beaucoup plus vite !
ensuite j'ai cherché sur google les attributs UNIQUE et IGNORE mais je n'ais rien trouvé d'interressant
INSERT INTO tb_url
(lbl_url)
SELECT lbl_url
FROM tb_url
WHERE not exists (select lbl_url from tb_url Where lbl_url = 'http://www.manserk.com/')
avec cette requete je n'eregistre pas l'url si elle est deja dans la table, c'est ce que je veux
mais si elle est deja dans la table elle est tout simplement doublée

ce que je ne veux pas
comment faire en sorte que le 'SELECT ... '
http://www.manserk.com/' soit juste un test et pas l'enregistrement a faire ?
Re: IF NOT EXISTS
Posté : 24 nov. 2010, 11:43
par ouckileou
Ce dont parlait devlop78 c'est une contrainte sur la colonne, non pas dans la requête. Tu dis à la création de la table (ou après en la modifiant) que telle colonne ne peut contenir deux fois la même valeur :
http://dev.mysql.com/doc/refman/5.0/fr/ ... table.html
| [CONSTRAINT [symbol]] UNIQUE [INDEX]
Re: IF NOT EXISTS
Posté : 24 nov. 2010, 21:39
par devlop78
Vérifie bien ton interclassement, il serait assez bête d'accepter une valeur avec juste une différence de majuscule/minuscule.
Ensuite, on peut très bien imaginer
INSERT INTO tb_url
(TRIM(lbl_url)) ...
Pour éviter d'avoir des espaces avant et après, et ainsi des doublons sur des différences d'espace.
Ensuite, on peut aller plus loin avec Mysql ou PHP, pour n'enregistrer que l'hôte, afin d'éviter d'avoir des différences sur des pages.
Voilà

Re: IF NOT EXISTS
Posté : 25 nov. 2010, 11:28
par Manserk
Pour ce qui est des valeurs ce n'est pas un problème puisque ce n'est pas un utilisateur qui rentre les urls donc le même format est toujours respecté
bon et bien ça a l'air de fonctionner : voici ma requête
INSERT IGNORE INTO tb_url (lbl_url) VALUES (:link)
+ j'ai mis le champ en unique
merci a tous
Re: IF NOT EXISTS
Posté : 25 nov. 2010, 20:59
par devlop78
Attention que dans ton cas, Mysql ne renverra pas d'erreur, donc pas moyen de se fier à un
if (mysql_query (...)),
puisqu'il te renverra true.