案例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
复制相似问题