【问题标题】:MySQL — ON DUPLICATE KEY UPDATE only when both unique fields match, else INSERTMySQL - 只有当两个唯一字段都匹配时才进行重复键更新,否则插入
【发布时间】:2017-01-31 06:19:02
【问题描述】:

我有以下查询:

"INSERT INTO `occ_apps` (`occ_date`, `service_tag`, `counter`) VALUES (?, ?, '1') ON DUPLICATE KEY UPDATE `counter` = (`counter`+1)"

目前,当occ_dateservice_tag 连续匹配时,它会增加counter。 其中occ_dateservice_tagunique 字段,我无法为这两个唯一字段设置主键。

我运行了以下内容:

ALTER TABLE occ_apps
DROP PRIMARY KEY,
ADD PRIMARY KEY (occ_date, service_tag);

我明白了,错误:

`#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key`

我希望它仅在 occ_dateservice_tag 在一行中都匹配(已经存在)时更新(增加)计数器,否则它应该插入一个新行。

Software version: 5.5.53-MariaDB-1~wheezy - mariadb.org binary distribution

当我运行DESC occ_apps 时,我得到:

Field           Type            Null        Key     Default     Extra

serial_no       int(255)        NO          PRI     NULL          auto_increment
occ_date        varchar(255)    NO          UNI     NULL        
counter         int(255)        NO                  NULL    
service_tag     varchar(255)    YES         UNI     NULL    

【问题讨论】:

  • ADD UNIQUE KEY (occ_date, service_tag) 这应该对你有帮助。
  • 你能分享desc occ_apps的结果吗?
  • @KeyurShah 总是更好地询问 SHOW CREATE TABLE
  • @KeyurShah 用desc occ_apps的结果更新了问题
  • 你的柜台到底应该持有什么?

标签: mysql primary-key multiple-columns unique-index on-duplicate-key


【解决方案1】:

我认为您的表中甚至不需要计数器字段。看起来您的计数器仅保存给定值出现的次数。这可以使用 GROUP BY 轻松生成

SELECT occ_date, COUNT(*) FROM occ_apps GROUP BY `occ_date`;

所以您想过滤查询以便只获得至少 5 个计数的项目?

SELECT occ_date, COUNT(*) FROM occ_apps  WHERE service_tag = 'service-1'
GROUP BY `occ_date` HAVING COUNT(*) > 5

这些问题已经使用GROUP BY 解决了数百万次。就 SQL 查询聚合可以做什么而言,这只是冰山一角。请花点时间阅读。

【讨论】:

  • 在获取时,我需要SELECT occ_date 其中counter > 5 AND service_tag = service-1。这就是为什么我需要为相同的日期和相同的服务增加 counter,即只有当 occ_dateservice_tag 都已经存在于单行中时,否则 INSERT 新行。
  • 谢谢,它按预期工作,我不知道我也可以这样。感谢您的耐心和努力!!祝您的业务快速发展!
  • 很高兴能帮上忙。谢谢你的好心cmets。祝您的项目一切顺利
猜你喜欢
  • 2016-04-21
  • 2020-01-15
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多