mysql insert…使用部分值进行重复更新时

dohp0rv5  于 2021-06-21  发布在  Mysql
关注(0)|答案(0)|浏览(221)

我有一个可能不完整的值集的列表,这些值将用于使用insert…on duplicate key update构造附加到或更新mysql表。要求如下:
如果操作解析为insert并且提供了字段值,则使用提供的值;
如果操作解析为insert,并且未提供字段值,则使用字段的表默认值;
如果操作解析为更新,并且提供了字段值,则使用提供的值;
如果操作解析为更新,但未提供字段值,请保留当前(表)字段值。
我提出了以下声明,但是**中的子句是错误的,我很难表达它们:

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 设置默认(非空)值。
我试过但不满意的事情:
将默认值替换为null,然后测试,例如。, IF (VALUES (num) = NULL ... . 这是可行的,但插入时会插入null(并生成一个警告-例如,“column'text'cannot be null”),这是不可接受的-我需要将默认值应用于缺少的字段;
对于缺少的值,使用“”而不是默认值,并测试“”(strcmp),但在插入的情况下,这将插入“”;
我没有尝试过这个方法,因为我找不到命令/正确的语法,但是我的想法是测试(在if子句中)是否 num 以及 text in值是文本(num或string)或mysql关键字(即default)-可能使用regex?-然后采取相应的行动。
当然,上述方法的替代方法可能需要从数据库中获取现有值和/或将缺少字段的默认值硬编码到查询中,但我相信使用单个mysql语句可以更优雅地获得相同的结果。
提前感谢您的反馈。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题