MySQL ON DUPLICATE KEY UPDATE不生效问题排查
问题根源:更新语句等于“原地赋值”
你遇到的问题太典型了——看一下你生成的SQL里的ON DUPLICATE KEY UPDATE部分:
ON DUPLICATE KEY UPDATE active=active,category=category,views=views,...
每一行都是把列的值设置成它自己当前的值,数据库执行这条语句时完全没有任何实际的更新操作,相当于白写了!
为什么会这样?
你原本的意图应该是:当movie_title重复时,用INSERT语句里的新值去覆盖旧行的对应列,但你现在的写法根本没有引用INSERT中的新数据,只是让数据库把列值设成它本身。
正确的写法
你需要用VALUES(列名)来引用INSERT语句中对应列的新值,把更新部分改成这样:
修正后的SQL示例
INSERT INTO movies (movie_title,time_published,language,views,visitor_views,active, type,checked,category,rating,subtitle) VALUES ('Bodyguard','2016-12-17 06:54:26','1','2091','15', '1','0','0','Feature Film ','3.66','Bodyguard.vtt') ON DUPLICATE KEY UPDATE active=VALUES(active), category=VALUES(category), views=VALUES(views), visitor_views=VALUES(visitor_views), checked=VALUES(checked), subtitle=VALUES(subtitle), rating=VALUES(rating), type=VALUES(type), language=VALUES(language), time_published=VALUES(time_published) -- 别忘了这个列,你之前的更新里漏掉了
对应PHP代码的修改
把wpdb的query语句里的UPDATE部分调整一下:
$wpdb->query($wpdb->prepare( "INSERT INTO movies (movie_title,time_published,language,views,visitor_views,active,type,checked,category,rating,subtitle) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE active=VALUES(active), category=VALUES(category), views=VALUES(views), visitor_views=VALUES(visitor_views), checked=VALUES(checked), subtitle=VALUES(subtitle), rating=VALUES(rating), type=VALUES(type), language=VALUES(language), time_published=VALUES(time_published)", $movie_title,$time_published,$language,$views,$visitor_views,$active,$type,$checked,$category,$rating,$subtitle ));
额外要确认的点
- 确保
movie_title列确实被设置了唯一约束(主键或者UNIQUE索引),否则ON DUPLICATE KEY UPDATE根本不会触发——数据库只会认为是新行,直接插入而不会执行更新。 - 检查你是否需要更新
time_published列:你之前的更新里没包含它,如果你希望重复时更新发布时间,记得加上(就像上面示例里那样)。
内容的提问来源于stack exchange,提问作者user892134
相关产品推荐
相关产品推荐

