使用 IF 插入重复密钥更新

1 mysql

我有sy_version一个有 2 列主键的表(mod_id, sub_mod)::

CREATE TABLE `sy_version` (
`mod_id` VARCHAR(2) NOT NULL,
`sub_mod` VARCHAR(30) NOT NULL,
`version` VARCHAR(50) NULL DEFAULT NULL,
`remark` VARCHAR(50) NULL DEFAULT NULL,
`update_date` DATETIME NULL DEFAULT NULL,
`download_link` VARCHAR(50) NULL DEFAULT NULL,
`file` BLOB NULL,
PRIMARY KEY (`mod_id`, `sub_mod`)
)COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

我的数据是

CS;sbm_sl.exe;2015.11.01;IBS Sales App;2015-11-10 11:34:13;\N;0x73002E00000000
Run Code Online (Sandbox Code Playgroud)

我想使用 更新我的数据insert into on duplicate key,首先它工作正常。但是每次我执行时,我都会得到我的file列变成,我想要的结果是:当我想要设置的版本大于当前(原始)版本时,NULL文件变成。NULL命令如下:

INSERT INTO sbm_sys.sy_version (mod_id,sub_mod,`version`,remark,update_date,file) 
values ('CS','sbm_sl.exe','2015.11.07.1','IBS Sales App','2015-11-10 11:34:13', NULL) 
ON DUPLICATE KEY UPDATE `version`='2015.11.07.1', remark='IBS Sales App', 
update_date='2015-11-10 11:34:13', file=if(VALUES(version)>version,null,file) ;
Run Code Online (Sandbox Code Playgroud)

它工作不正常,file列没有变为NULL,但其他列已更新,所以我尝试更改部分变为,它按我希望的方式工作:

file=if(VALUES(version)>version,null,file) ==> file=if(VALUES(version)>'2015.11.01',null,file) ; 
Run Code Online (Sandbox Code Playgroud)

问题是我如何无法从原始版本值中获取“2015.01.01”?

谢谢你的建议。

ype*_*eᵀᴹ 6

我认为你应该尝试这个改变:

INSERT INTO sbm_sys.sy_version
    (mod_id, sub_mod, version, remark, update_date, `file`) 
VALUES 
    ('CS', 'sbm_sl.exe', '2015.11.07.1', 'IBS Sales App', '2015-11-10 11:34:13', NULL)
ON DUPLICATE KEY UPDATE 
    `file` = IF(VALUES(version) > version, NULL, `file`),    -- first this column
    version = VALUES(version),                               -- then this one
    remark = VALUES(remark), 
    update_date = VALUES(update_date) ;
Run Code Online (Sandbox Code Playgroud)

不幸的是,与 SQL 标准相反,列的顺序很重要。MySQL文档指出UPDATE

以下语句中的第二个赋值设置col2为当前(更新后)col1值,而不是原始col1值。结果是 col1 和 col2 具有相同的值。此行为与标准 SQL 不同。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

单表UPDATE分配通常从左到右进行评估。...