首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL -如何将插入、插入、忽略和重复更新合并成一个工作查询?

MySQL -如何将插入、插入、忽略和重复更新合并成一个工作查询?
EN

Stack Overflow用户
提问于 2017-11-16 16:35:52
回答 1查看 525关注 0票数 2

案例1:

代码语言:javascript
运行
复制
ID                Loc                In                    Out
----------------------------------------------------------------
null              null               null                  null

本例的工作查询:

代码语言:javascript
运行
复制
INSERT INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL );

案例2:

代码语言:javascript
运行
复制
ID                 Loc                In                    Out
----------------------------------------------------------------
PA                 Area 1             2017-11-16 11:20:09   null

本例的工作查询:

代码语言:javascript
运行
复制
INSERT IGNORE INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL );

案例3:

代码语言:javascript
运行
复制
ID                 Loc                In                    Out
----------------------------------------------------------------
PA                 Area 1             null                  2017-11-16 11:20:09

本例的工作查询:

代码语言:javascript
运行
复制
INSERT INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL )
ON DUPLICATE KEY UPDATE In = now(), Out = NULL;

如何将上述3“工作查询”合并成一个?

基本上,目标是只在PK == DuplicateIn == NULL的情况下执行case 3。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 17:12:19

INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE是相互排斥的。当要插入的行与UNIQUE INDEX上已经存在的行冲突时,它们都会处理这种情况。

IGNORE将错误转换为警告,这基本上允许查询成功,忽略新值。

ON DUPLICATE KEY UPDATE用新值更新现有行的某些字段。

只有在发生UNIQUE INDEX冲突时才使用这两个子句;否则将忽略它们。这使得这两种方法在你的案例#1中都能工作。

基本上,目标是只在PK == DuplicateIn == NULL的情况下执行case 3。

精心编制的ON DUPLICATE KEY UPDATE子句可以完成以下工作:

代码语言:javascript
运行
复制
INSERT INTO Inventory VALUES('PA', 'Area 1', NOW(), NULL)
ON DUPLICATE KEY UPDATE
    `In` = IF(ISNULL(`In`), VALUES(`In`), `In`),
    `Out` = NULL

表达式IF(ISNULL(`In`), VALUES(`In`), `In`)的值为VALUES(`In`) (要插入的VALUES()列表中的In值),如果列In的当前值为NULL,则为列In的当前值(如果不是NULL )。

这样,只有在当前值为In的情况下,INSERT查询提供的值才会替换列NULL的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47334834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档