2017-07-05 2 views
0

J'ai donc une table product_supplier à laquelle j'ai besoin d'ajouter des données depuis import_tbl. Product_supplier a trois colonnes product_id, supplier_id et price. Import_tbl a les mêmes colonnes plus un peu plus. Ce qui est le plus important et ce que je n'arrive pas à faire, c'est que lorsqu'une combinaison spécifique de product_id et supplier_id existe, seul le prix doit être mis à jour. Si cette combinaison n'existe pas, une nouvelle ligne doit être ajoutée. J'ai essayé cette requêteInsérer avec une mise à jour de clé en double ignore l'index

INSERT INTO product_supplier (product_id, supplier_id, price) 
SELECT i.product_id, i.supplier_id, i.price 
FROM import_tbl i 
ON DUPLICATE KEY UPDATE 
    price = i.price 

Celui-ci fonctionne si j'ajoute une ligne avec une nouvelle product_id, mais il ignore totalement la supplier_id. Donc, il ne sera pas ajouter de nouvelles lignes si une ligne utilise le même id_produit mais un fournisseur différent.

Je pense que cela a quelque chose à voir avec les index, et j'ai essayé des index uniques pour à la fois product_id, et supplier_id et un index à plusieurs colonnes de product_id et supplier_id. Mais quand je mets EXPLAIN devant la requête, il ne reconnaît jamais les index. S'il vous plaît, aidez, merci!

Tableau structure product_supplier

+---------------------+---------+------+-----+---------+----------------+ 
|  Field  | Type | Null | Key | Default |  Extra  | 
+---------------------+---------+------+-----+---------+----------------+ 
| product_supplier_id | int(11) | NO | PRI | NULL | auto_increment | 
| product_id   | int(11) | NO | UNI | 0  |    | 
| supplier_id   | int(11) | NO | MUL | 0  |    | 
| price    | int(11) | NO |  | 0  |    | 
+---------------------+---------+------+-----+---------+----------------+ 
+0

pouvez-vous inclure la structure de la table pour product_supplier? –

+0

J'ai ajouté la structure de la table pour product_supplier –

+0

Votre instruction select n'a aucun sens. En l'absence d'un ordre explicite par, la valeur du prix ne sera pas déterministe et cessera de conserver toute association avec les autres attributs. Mais ceci est sans objet puisque vous n'avez pas de clé primaire ou unique qui est remplie à partir du select. Nous ne pouvons pas résoudre ce problème parce que nous ne savons pas ce que les données signifient/d'où elles proviennent et vous n'avez donné aucun exemple d'entrée et de sortie. – symcbean

Répondre

0

Il semble que vous avez un problème clé. Le paramètre "ON DUPLICATE KEY UPDATE" ne prend en compte que la clé primaire de la table, dans ce cas un combo primaire de product_supplier_id plus product_id. Le champ product_supplier_id n'est pas inclus dans votre INSERT et est ensuite généré automatiquement. Si vous voulez vraiment faire cette validation en une seule action (au lieu de cocher pour exister, puis choisir d'insérer ou de mettre à jour), vous devrez déplacer la clé primaire pour être basée sur une combinaison de product_id et supplier_id et supprimez le champ d'auto-incrémentation.

Si vous devez avoir plusieurs prix par produit/fournisseur, vous ne pouvez pas utiliser ON DUPLICATE KEY UPDATE et devrez exécuter plusieurs requêtes.