我的表:
----------------------------
| valueA | valueB | valueC |
----------------------------
| ... | ... | ... |
| ... | ... | ... |
- 主键为(valueA,valueB(
- 如果条目已存在,我希望插入值或更新值C
我的代码:
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。
在我的示例中,表(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);
小提琴
如果值是字符串,您会怎么做?–Colin
LEAST
/GREATEST
函数正确处理字符串值。不停摆弄唯一的问题是计算列的数据类型必须能够接受该值。