首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql如果两个字段重复,如何插入或更新?

问MySql如果两个字段重复,如何插入或更新?
EN

Stack Overflow用户
提问于 2014-06-24 05:50:06
回答 1查看 83关注 0票数 1

我正在尝试找出最好的解决方案,我知道重复键更新是处理这种情况的理想方法,但被检查的字段可能会多次出现,唯一的是userId和productId字段之间的关系,而不是字段本身。因为1的userId可以喜欢多个产品..

基本上,我想要完成的是,最好不要删除和重新插入现有的字段,如果用户喜欢一个特定的产品,isActive将等于1,如果他们在喜欢之前不喜欢这个产品,我们将isActive设置为0。如果他们再次喜欢相同的产品,并且满足userId和productId条件,则将其userId重现他们过去已经喜欢的产品(Row existing),然后将isActive设置为1。

我基本上想使用isActive作为切换,以防止Id的碎片,因为据我所知,这比删除和重新插入更有效,更可取?

我该如何编写MySQL查询来实现这一点呢?

这是表模式

​

​

EN

回答 1

Stack Overflow用户

发布于 2014-06-24 06:23:55

如果(userId, productId)的组合是唯一的,那么您可以在该元组上创建一个唯一的约束,例如

代码语言:javascript
复制
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“类型的功能。但这会将逻辑分散到应用程序和数据库之间,并需要维护另一个数据库对象。您可能会认为,存储过程方法的额外复杂性超过了潜在的性能收益;您在改进性能方面所做的努力可能更好地针对其他方面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24375145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档