我正在尝试找出最好的解决方案,我知道重复键更新是处理这种情况的理想方法,但被检查的字段可能会多次出现,唯一的是userId和productId字段之间的关系,而不是字段本身。因为1的userId可以喜欢多个产品..
基本上,我想要完成的是,最好不要删除和重新插入现有的字段,如果用户喜欢一个特定的产品,isActive将等于1,如果他们在喜欢之前不喜欢这个产品,我们将isActive设置为0。如果他们再次喜欢相同的产品,并且满足userId和productId条件,则将其userId重现他们过去已经喜欢的产品(Row existing),然后将isActive设置为1。
我基本上想使用isActive作为切换,以防止Id的碎片,因为据我所知,这比删除和重新插入更有效,更可取?
我该如何编写MySQL查询来实现这一点呢?
这是表模式

发布于 2014-06-24 06:23:55
如果(userId, productId)的组合是唯一的,那么您可以在该元组上创建一个唯一的约束,例如
CREATE UNIQUE INDEX mytable_UX1 ON mytable (userId, productId)然后,您可以使用单一的INSERT ... ON DUPLICATE KEY语法。(请注意,insert尝试将耗尽AUTO_INCREMENT值,即使由于"duplicate key“异常而没有插入行。)
如果没有UNIQUE约束,则需要组合使用INSERT和UPDATE语句。
尝试更新,并检查MySQL中的“找到行”计数。在您的例子中,如果isActive被定义为整数类型并且不为NULL,并且使用赋值isActive = !isActive,“受影响的行数”计数将与“找到的行数”计数相匹配;
注意:对于将来的读者,在更一般的情况下,我们不能保证找到的行将实际需要更新,当“找到的行数”计数为非零时,“受影响的行数”计数可能为零。mysqli和PDO都有一些设置(在连接上),可以覆盖默认行为,并指定“受影响的行”将返回“找到的行”。
通过检查UPDATE语句“匹配”的行数,您可以知道INSERT语句是否需要运行。
MySQL不支持ANSI "MERGE“语法。
因此,除了SQL语句之外,MySQL还需要(至少)发出两个单独的INSERT ... ON DUPLICATE KEY语句。
这两个单独的语句可以捆绑到一个存储过程中,这样您就可以通过一个数据库调用来执行"upsert“类型的功能。但这会将逻辑分散到应用程序和数据库之间,并需要维护另一个数据库对象。您可能会认为,存储过程方法的额外复杂性超过了潜在的性能收益;您在改进性能方面所做的努力可能更好地针对其他方面。
https://stackoverflow.com/questions/24375145
复制相似问题