MySQL — 仅当两个唯一字段匹配时才进行重复键更新,否则插入
MySQL — ON DUPLICATE KEY UPDATE only when both unique fields match, else INSERT
我有以下查询:
"INSERT INTO `occ_apps` (`occ_date`, `service_tag`, `counter`) VALUES (?, ?, '1') ON DUPLICATE KEY UPDATE `counter` = (`counter`+1)"
当前,当 occ_date
或 service_tag
连续匹配时,它会递增 counter
。
其中 occ_date
和 service_tag
是 unique
字段,我无法将主键设置为两个唯一字段。
我运行以下:
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_date
和 service_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
我认为您 table 中甚至不需要计数器字段。看起来您的计数器只是保存给定值出现的次数。这可以使用 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 查询聚合的功能而言,这只是冰山一角。请花点时间仔细阅读。
我有以下查询:
"INSERT INTO `occ_apps` (`occ_date`, `service_tag`, `counter`) VALUES (?, ?, '1') ON DUPLICATE KEY UPDATE `counter` = (`counter`+1)"
当前,当 occ_date
或 service_tag
连续匹配时,它会递增 counter
。
其中 occ_date
和 service_tag
是 unique
字段,我无法将主键设置为两个唯一字段。
我运行以下:
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_date
和 service_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
我认为您 table 中甚至不需要计数器字段。看起来您的计数器只是保存给定值出现的次数。这可以使用 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 查询聚合的功能而言,这只是冰山一角。请花点时间仔细阅读。