kir*_*off 18 mysql upsert sql-update sql-insert
从MySQL 4.1.0开始,ON DUPLICATE KEY UPDATE
当插入的值(带INSERT
或SET
或VALUES
)已经在目标表wrt PRIMARY KEY
或某个UNIQUE
字段中时,可以添加语句来指定行为.如果PRIMARY KEY
某个UNIQUE
字段的值已经在表中,INSERT
则替换为UPDATE
.
ON DUPLICATE KEY UPDATE
如果UNIQUE
我的表中有多个字段,表现
如何?
如果两个UNIQUE
字段匹配,我可以只有一个更新吗?
只有当两个UNIQUE
字段同时匹配时才能更新吗?
kir*_*off 25
考虑
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Run Code Online (Sandbox Code Playgroud)
如果a和b是UNIQUE
字段,则UPDATE
发生在a = 1 OR b = 2
.此外,当a = 1 OR b = 2
两个或多个条目满足条件时,更新只进行一次.
此处包含Id和Name UNIQUE
字段的表格表
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Run Code Online (Sandbox Code Playgroud)
如果查询是
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
Run Code Online (Sandbox Code Playgroud)
然后我们得到
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
Run Code Online (Sandbox Code Playgroud)
这违反了Id和Name的唯一性.现在用
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7
Run Code Online (Sandbox Code Playgroud)
我们得到
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Run Code Online (Sandbox Code Playgroud)
多个键上的行为如下
UPDATE
ON DUPLICATE KEY UPDATE
如果其中一个UNIQUE
字段等于要插入的值,则执行in .在这里,UPDATE
执行Id = 1 OR Name = C
.它相当于
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
Run Code Online (Sandbox Code Playgroud)
如果我只想要一个更新,对于任一键,该怎么办?
可以使用UPDATE
带LIMIT
关键字的语句
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
哪个会给
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Run Code Online (Sandbox Code Playgroud)
如果仅在两个键的值匹配时才需要更新,该怎么办?
一种解决方案是ALTER TABLE
使PRIMARY KEY
(或唯一性)在两个领域都有效.
ALTER TABLE table
DROP PRIMARY KEY
ADD PRIMARY KEY (Id, Name);
Run Code Online (Sandbox Code Playgroud)
从今起
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7
Run Code Online (Sandbox Code Playgroud)
我们得到
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
Run Code Online (Sandbox Code Playgroud)
因为没有找到重复(在两个键上).
归档时间: |
|
查看次数: |
17747 次 |
最近记录: |