案例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 == Duplicate
和In == NULL
执行案例3。感谢。
答案 0 :(得分:2)
INSERT IGNORE
和INSERT ... ON DUPLICATE KEY UPDATE
是互斥的。当要插入的行与UNIQUE INDEX
上已存在的行冲突时,它们都处理这种情况。
IGNORE
将错误转换为警告,这基本上可以让查询成功并忽略新值。
ON DUPLICATE KEY UPDATE
使用新值更新现有行的某些字段。
只有发生UNIQUE INDEX
冲突时才使用这两个子句;否则他们会被忽略。这使得它们都适用于您的情况#1
基本上,目标是仅在
PK == Duplicate
和In == 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>
查询提供的值替换。