MySQL - 如何将INSERT,INSERT IGNORE和ON DUPLICATE UPDATE组合成一个工作查询?

时间:2017-11-16 16:35:53

标签: mysql sql

案例1:

ID                Loc                In                    Out
----------------------------------------------------------------
null              null               null                  null

此案例的工作查询:

INSERT INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL );

案例2:

ID                 Loc                In                    Out
----------------------------------------------------------------
PA                 Area 1             2017-11-16 11:20:09   null

此案例的工作查询:

INSERT IGNORE INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL );

案例3:

ID                 Loc                In                    Out
----------------------------------------------------------------
PA                 Area 1             null                  2017-11-16 11:20:09

此案例的工作查询:

INSERT INTO Inventory VALUES( 'PA', 'Area 1', now(), NULL )
ON DUPLICATE KEY UPDATE In = now(), Out = NULL;

如何结合上述3"工作查询"成一个?

基本上,目标是仅在PK == DuplicateIn == NULL执行案例3。感谢。

1 个答案:

答案 0 :(得分:2)

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

IGNORE将错误转换为警告,这基本上可以让查询成功并忽略新值。

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

只有发生UNIQUE INDEX冲突时才使用这两个子句;否则他们会被忽略。这使得它们都适用于您的情况#1

  

基本上,目标是仅在PK == DuplicateIn == NULL执行案例3。

精心设计的ON DUPLICATE KEY UPDATE条款可以完成这项工作:

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`)的值为In(要插入的VALUES()列表中In的值)如果不是NULL,则为In或列NULL的当前值。

这样,只有当In查询的当前值为INSERT时,NULL列的值才会被<div id=app> <div class="input-field "> <input type="text" v-model="value" id="field"> <label for="field">Field</label> </div> <div @click="value='newValue'"> clickOnMe </div> </div> 查询提供的值替换。