我有一个可能不完整的值列表,这些值将用于使用INSERT ... ON DUPLICATE KEY UPDATE构造附加或更新MySql表。要求如下:
我已经提出以下陈述,但**中包含的条款是错误的,我很难表达它们:
INSERT INTO `test`
(`id`, `num`, `text`)
VALUES
('1', 100, 'aaa'),
('2', 200, DEFAULT),
('3', DEFAULT, 'ccc')
ON DUPLICATE KEY UPDATE
`num` = IF (**VALUES(`num`) = DEFAULT**, `num`, VALUES(`num`)),
`text` = IF (**VALUES(`text`) = DEFAULT**, `text`, VALUES(`text`));
注意:id
是唯一键。 num
和text
都设置了默认(NOT NULL)值。
我尝试过的事情,但并不令人满意:
用NULL替换VALUES中的DEFAULT,然后测试,例如IF (VALUES (num) = NULL ...
。这有效,但会在INSERT上插入NULL(并生成警告 - 例如,"列'文本'不能为空"),这是不可接受的 - 我需要有默认值适用于缺失的字段;
使用类似' xxx'而不是DEFAULT的缺失值,并测试' xxx' (STRCMP),但这会插入' xxx'如果是INSERT;
我没试过这个,因为我找不到命令/正确的语法,但想法是测试(在IF子句中)num
和{{1在VALUES中是文字(num或string)或MySql关键字(即DEFAULT) - 可能使用正则表达式? - 然后采取相应行动。
当然,上述替代方法可能需要从数据库中获取现有值和/或将缺省字段的默认值硬编码到查询中,但我相信使用单个MySql语句可以更优雅地实现相同的结果。
提前感谢您的反馈。