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 17/03/2011, 09h21   #1
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 474
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 474
Points : 681
Points : 681
Envoyer un message via Skype™ à hornetbzz
Par défaut mysql 5.0 - upsert

Bonjour,

Pas un grand spécialiste de SQL, je cherche à réaliser un upsert directement avec SQL avec le moteur MyIsam, sans jongler avec le code (bash) :

La table "model"
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `model` (
 `id_model` int(11) NOT NULL AUTO_INCREMENT,
 `id_product` int(11) NOT NULL,
 `prod_model` varchar(20) collate utf8_unicode_ci NOT NULL,
 `prod_firmware` varchar(20) collate utf8_unicode_ci NOT NULL,
 `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY  (`id_model`),
 UNIQUE KEY `one_idmodel_4_one_firmware` (`id_model`,`prod_firmware`,`prod_model`),
 KEY `prod_firmware` (`prod_firmware`),
 KEY `prod_model` (`prod_model`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Je voudrais être certain de n'avoir qu'un seul tuple de valeurs (id_model`,`prod_firmware`,`prod_model), lors d'une insertion. Si le tuple existe déjà, seul le champ "updated" est sensé se mettre à jour lors de l'insertion.

Voila ma tentative d'upsert :

Code :
INSERT INTO model (id_model, id_product, prod_model, prod_firmware, updated) VALUES (NULL,20,\"mon_produit\",\"son_firmware\",null) ON DUPLICATE KEY UPDATE updated=null
Sauf que qu'un nouvel id_model est créé même si le tuple (prod_firmware,prod_model) existe déjà ...

Comment procéder svp ?

PS: rien vu dans la FAQ ni dans ce tuto à propos d'upsert.
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 09h30   #2
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 474
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 474
Points : 681
Points : 681
Envoyer un message via Skype™ à hornetbzz
Euh, je crois que j'ai trouvé, c'est une erreur de logique :

Ce que je veux, c'est un couple unique de (`prod_firmware`,`prod_model`) et ne pas créer de nouvel id_model (auto incrémenté) dans le cas d'une insertion d'un couple existant.

Donc il faut que la contrainte d'unicité porte sur ce couple (`prod_firmware`,`prod_model`) et non sur le tuple (`id_model`, `prod_firmware`,`prod_model`), comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `model` (
 `id_model` int(11) NOT NULL AUTO_INCREMENT,
 `id_product` int(11) NOT NULL,
 `prod_model` varchar(20) collate utf8_unicode_ci NOT NULL,
 `prod_firmware` varchar(20) collate utf8_unicode_ci NOT NULL,
 `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY  (`id_model`),
 UNIQUE KEY `one_idmodel_4_one_firmware` (`prod_firmware`,`prod_model`),
 KEY `prod_firmware` (`prod_firmware`),
 KEY `prod_model` (`prod_model`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
hornetbzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 12h19   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 19h19.


 
 
 
 
Partenaires

Hébergement Web