IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration MySQL Discussion :

mysql 5.0 - upsert


Sujet :

Administration MySQL

  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. UPSERT (MySQL -> PostgreSQL)
    Par Fred_34 dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/09/2012, 11h50
  2. [Kylix] [cgi] pb déploiement appli avec connexion MySQL [rés
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 06/08/2002, 20h09
  3. Probleme C++Builder et Mysql
    Par noname dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 13h40
  4. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  5. [Kylix] Pb connection à Mysql
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 25/04/2002, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo