Page 1 sur 1

ON DUPLICATE KEY UPDATE

Posté : 29 janv. 2014, 13:31
par damien_55
Bonjour a tous,

J'ai une requete mysql comme ceci;
@mysql_query("INSERT INTO `cache_departement` (`id`,`ref_dep`,`ref_type`,`name_thing`,`city_thing`,`image_thing`,`url_thing`,`libelle_thing`,`price_thing`
) VALUES (NULL,
'".mysql_real_escape_string($_GET['depid'])."',     
'R0',
'".mysql_real_escape_string($content['decouvertes'][0]['titre_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['city'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['photo_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['url_actu'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['libelle'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['Prix'])."'
) ON DUPLICATE KEY UPDATE `ref_type`='R0' ") or die("Erreur MySQL : ".mysql_error());
L'enregistrement si il n'existe pas est bien crée mais la mise à jour des enregistrements présents ne se fait pas ?
(ref_type est bien en index unique).

Merci de votre aide.

Re: ON DUPLICATE KEY UPDATE

Posté : 29 janv. 2014, 15:32
par moogli
salut,

as tu testé la requête sql dans un client mysql ?

c'est quoi les clefs de ta table ?

@+

Re: ON DUPLICATE KEY UPDATE

Posté : 29 janv. 2014, 15:59
par damien_55
les clefs sont id en Primary, auto_increment, unique
et ref_type en unique

Je ne vois pas pourquoi seul l'ajout fonctionne et pas la mise a jours. J'ai tester meme probleme dans le phpmyadmin.

Re: ON DUPLICATE KEY UPDATE

Posté : 29 janv. 2014, 23:35
par moogli
ben tu force l'id à null donc déjà il ne peux pas forcer un update
de plus tu force la colonne ref_type = RO or si la colonne à une clef unique cela ne peux pas fonctionner plus d'une fois.

donc je pense que
ref_type n'a pas de clef unique
que seul l'id pourrait faire déclencher un update mais ce ne sera jamais le cas vu qu'il est forcé à null (et que donc on utilise le mécanisme d'auto incrément).

il faut revoir la chose quelque part car le ce que tu indique me semble cohérent.

peux tu fournir le ddl de la table (create table)?

@+

Re: ON DUPLICATE KEY UPDATE

Posté : 30 janv. 2014, 12:41
par damien_55
Voici le create table:

[mysql]CREATE TABLE `cache_departement` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(50) NOT NULL,
`ref_dep` varchar(4) NOT NULL DEFAULT '',
`ref_type` varchar(30) NOT NULL DEFAULT '',
`name_thing` varchar(255) NOT NULL DEFAULT '',
`city_thing` varchar(255) NOT NULL DEFAULT '',
`image_thing` varchar(255) NOT NULL DEFAULT '',
`url_thing` varchar(255) NOT NULL DEFAULT '',
`libelle_thing` varchar(255) NOT NULL DEFAULT '',
`price_thing` varchar(255) NOT NULL DEFAULT '',
`name_event` varchar(255) NOT NULL,
`manufacturer` varchar(255) NOT NULL DEFAULT '',
`start_event` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`end_event` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`extra2` varchar(255) NOT NULL DEFAULT '',
`url_event_sale` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `ref_type` (`ref_type`),
KEY `type` (`type`),
KEY `ref_dep` (`ref_dep`)
) ENGINE=MyISAM AUTO_INCREMENT=3401 DEFAULT CHARSET=utf8;[/mysql]

Je ne comprend toujours pas.

Re: ON DUPLICATE KEY UPDATE

Posté : 30 janv. 2014, 15:51
par moogli
ref_type étant unique tu ne peux avoir qu'une seule ligne dans la table avec ref_type=RO

or systématiquement tu veux insérer cette valeur.
ou alors la forcer à zéro !

je pense que tu ne comprend pas ce que fait cette requête et que tu te mélange un peu les pinceaux avec ce que tu veux au final.

si tu nous explique ce que tu tente de faire peux être que l'on pourrat t'aider.
La j'ai l'impression qu'il y a un problème de conception du modèle (vu l'utilisation que tu compte en faire).

@+

Re: ON DUPLICATE KEY UPDATE

Posté : 30 janv. 2014, 16:51
par damien_55
En fait cette requete me sert pour sauvegarder les données quotidiennement issus d'une tache cron:
@mysql_query("INSERT INTO `cache_departement` (`id`,`ref_dep`,`ref_type`,`name_thing`,`city_thing`,`image_thing`,`url_thing`,`libelle_thing`,`price_thing`
) VALUES (NULL,
'".mysql_real_escape_string($_GET['depid'])."',     
'R0',
'".mysql_real_escape_string($content['decouvertes'][0]['titre_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['city'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['photo_news'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['url_actu'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['libelle'])."',
'".mysql_real_escape_string($content['decouvertes'][0]['Prix'])."'
) ON DUPLICATE KEY UPDATE `ref_type`='R0' ") OR die("Erreur MySQL : ".mysql_error());
J'effectue ma requete sql tous les jours à 01:00 am, ce qui me permet d'avoir une sorte de créer un cache de donnée issu de mysql qui change tous les jours. cela rend le site plus rapide que de chercher les éléments actifs à chaque demande entre 2 dates.

En ce sens, je souhaite faire un ON DUPLICATE KEY UPDATE plutot qu'un update.

donc la mise a jour se fait sur une clef unique que j'ai appeler ref_type. si la clef existe, la mise a jour doit se faire si elle n'existe pas, je la creer d'ou ref_type=RO.

J'espere avoir été clair. Merci.