MySql INSERT ...使用部分VALUES进行DUPLICATE UPDATE

时间:2018-06-13 20:25:28

标签: mysql insert duplicates

我有一个可能不完整的值列表,这些值将用于使用INSERT ... ON DUPLICATE KEY UPDATE构造附加或更新MySql表。要求如下:

  • 如果操作解析为INSERT并且提供了字段值IS,请使用提供的值;
  • 如果操作解析为INSERT且字段值未提供,请使用字段表DEFAULT值;
  • 如果操作解析为UPDATE并且提供了字段值IS,请使用提供的值;
  • 如果操作解析为UPDATE且字段值未提供,则保留当前(表)字段值。

我已经提出以下陈述,但**中包含的条款是错误的,我很难表达它们:

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是唯一键。 numtext都设置了默认(NOT NULL)值。

我尝试过的事情,但并不令人满意:

  1. 用NULL替换VALUES中的DEFAULT,然后测试,例如IF (VALUES (num) = NULL ...。这有效,但会在INSERT上插入NULL(并生成警告 - 例如,"列'文本'不能为空"),这是不可接受的 - 我需要有默认值适用于缺失的字段;

  2. 使用类似' xxx'而不是DEFAULT的缺失值,并测试' xxx' (STRCMP),但这会插入' xxx'如果是INSERT;

  3. 我没试过这个,因为我找不到命令/正确的语法,但想法是测试(在IF子句中)num和{{1在VALUES中是文字(num或string)或MySql关键字(即DEFAULT) - 可能使用正则表达式? - 然后采取相应行动。

  4. 当然,上述替代方法可能需要从数据库中获取现有值和/或将缺省字段的默认值硬编码到查询中,但我相信使用单个MySql语句可以更优雅地实现相同的结果。

    提前感谢您的反馈。

0 个答案:

没有答案