2016-12-12 1 views
0

Quel est le problème avec l'instruction suivante?Erreur MySQL avec insertion/mise à jour sur la clé en double

J'essaie d'insérer des données dans ma table, mais le mettre à jour s'il y a une entrée en double - Quand je cours, je reçois l'erreur suivante:

(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 'updat e temp set impressions = impressions + 1, clicks = clicks + 0, ctr = (ctr +' at line 1")

def insert_or_update_new(self, profile_id, landing_page, keyword, position, impressions, clicks, ctr): 
    try: 
     self.cursor.execute('''insert into temp (profile_id, landing_page, keyword, position, impressions, clicks, ctr) values (%s, %s, %s, %s, %s, %s, %s) on duplicate key update temp set impressions = impressions + %s, clicks = clicks + %s, ctr = (ctr + %s/2)''', (profile_id, landing_page, keyword, position, impressions, clicks, ctr, impressions, clicks, ctr)) 
     self.db.commit() 
    except Exception as e: 
     self.db.rollback() 
     # Rollback in case there is any error 
     return e 

Mise à jour: Mise à jour en double Removed - Erreur toujours là.

+0

Vous avez dupliqué 'update update'. – cwallenpoole

Répondre

1

Votre déclaration devrait ressemblez pas à

on duplicate key update update temp set impressions... 

mais

on duplicate key update impressions=... 
+0

Votre beauté :) Acceptera une fois que cela me le permettra. Toute explication sur pourquoi c'est? – Adders

+0

regardez le lien fourni par larwa1n ci-dessous et il y a une syntaxe que vous pouvez utiliser :) – rafwlaz

0

Votre déclaration inclut le mot mise à jour deux fois, en supprimant on pourrait faire l'affaire :-)

+0

Bien repéré, mais toujours obtenir (1064, "Vous avez une erreur dans votre syntaxe SQL, consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser" set i mpressions = impressions + 1, clics = clics + 0, ctr = (ctr + 0/2) 'à la ligne 1 ") – Adders

+0

Je pense que le * set * n'est pas non plus nécessaire. Voir http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html – Iarwa1n