MySQL INSERT INTO ON DUPLICATE KEY UPDATE 有两个字段
MySQL INSERT INTO ON DUPLICATE KEY UPDATE with two fields
我的table:
----------------------------
| valueA | valueB | valueC |
----------------------------
| ... | ... | ... |
| ... | ... | ... |
- 主键是(valueA, valueB)
- 如果条目已经存在,我想插入值或更新 valueC
我的代码:
INSERT INTO myTable (valueA, valueB, valueC) VALUES
(1, 2, 1),
(1, 2, 2),
(2, 1, 3),
(3, 4, 4)
on duplicate key update valueC = 5;
该语句的结果:
----------------------------
| valueA | valueB | valueC |
----------------------------
| 1 | 2 | 5 |
| 2 | 1 | 3 |
| 3 | 4 | 4 |
我不仅要更新新值 A = 旧值 A 和新值 B = 旧值 B,还要更新新值 A = 旧值 B 和新值 B = 旧值 A。
在我的例子中 table (1, 2, 1), (1, 2, 2) 和 (2, 1, 3) 是重复的。不只是 (1, 2, 1) 和 (1, 2, 2).
它应该是这样的:
----------------------------
| valueA | valueB | valueC |
----------------------------
| 1 | 2 | 5 |
| 3 | 4 | 4 |
如何使用尽可能少的语句来做到这一点?提前致谢。
ALTER TABLE myTable
ADD COLUMN least_value INT AS ((LEAST(valueA, valueB))),
ADD COLUMN greatest_value INT AS ((GREATEST(valueA, valueB))),
ADD UNIQUE INDEX idx (least_value, greatest_value);
what would you do if the values were strings? – Colin
LEAST
/GREATEST
函数正确处理字符串值。 fiddle。唯一的问题 - 计算列的数据类型必须能够接受该值。
我的table:
----------------------------
| valueA | valueB | valueC |
----------------------------
| ... | ... | ... |
| ... | ... | ... |
- 主键是(valueA, valueB)
- 如果条目已经存在,我想插入值或更新 valueC
我的代码:
INSERT INTO myTable (valueA, valueB, valueC) VALUES
(1, 2, 1),
(1, 2, 2),
(2, 1, 3),
(3, 4, 4)
on duplicate key update valueC = 5;
该语句的结果:
----------------------------
| valueA | valueB | valueC |
----------------------------
| 1 | 2 | 5 |
| 2 | 1 | 3 |
| 3 | 4 | 4 |
我不仅要更新新值 A = 旧值 A 和新值 B = 旧值 B,还要更新新值 A = 旧值 B 和新值 B = 旧值 A。
在我的例子中 table (1, 2, 1), (1, 2, 2) 和 (2, 1, 3) 是重复的。不只是 (1, 2, 1) 和 (1, 2, 2).
它应该是这样的:
----------------------------
| valueA | valueB | valueC |
----------------------------
| 1 | 2 | 5 |
| 3 | 4 | 4 |
如何使用尽可能少的语句来做到这一点?提前致谢。
ALTER TABLE myTable
ADD COLUMN least_value INT AS ((LEAST(valueA, valueB))),
ADD COLUMN greatest_value INT AS ((GREATEST(valueA, valueB))),
ADD UNIQUE INDEX idx (least_value, greatest_value);
what would you do if the values were strings? – Colin
LEAST
/GREATEST
函数正确处理字符串值。 fiddle。唯一的问题 - 计算列的数据类型必须能够接受该值。