案例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的情况下执行case 3。谢谢。
发布于 2017-11-16 17:12:19
INSERT IGNORE和INSERT ... ON DUPLICATE KEY UPDATE是相互排斥的。当要插入的行与UNIQUE INDEX上已经存在的行冲突时,它们都会处理这种情况。
IGNORE将错误转换为警告,这基本上允许查询成功,忽略新值。
ON DUPLICATE KEY UPDATE用新值更新现有行的某些字段。
只有在发生UNIQUE INDEX冲突时才使用这两个子句;否则将忽略它们。这使得这两种方法在你的案例#1中都能工作。
基本上,目标是只在
PK == Duplicate和In == NULL的情况下执行case 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`) (要插入的VALUES()列表中的In值),如果列In的当前值为NULL,则为列In的当前值(如果不是NULL )。
这样,只有在当前值为In的情况下,INSERT查询提供的值才会替换列NULL的值。
https://stackoverflow.com/questions/47334834
复制相似问题