我有一个可能不完整的值集的列表,这些值将用于使用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语句可以更优雅地获得相同的结果。
提前感谢您的反馈。
暂无答案!
目前还没有任何答案,快来回答吧!