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”?
谢谢你的建议。
我认为你应该尝试这个改变:
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
分配通常从左到右进行评估。...