tag:原文章地址
經常會遇到一行資料在特定條件下如果存在就更新列,不存在就插入新的行,用replace和duplicate語法都可以實現,但是也是有區別的。如果是資料覆蓋就用replace,如果只是想實現update就用duplicate。
如下表:
CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ota_homestay_id` bigint(20) NOT NULL DEFAULT '0',
`date` date NOT NULL DEFAULT '1970-01-01',
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
`state` tinyint(4) NOT NULL DEFAULT '0',
`inventory` smallint(6) NOT NULL DEFAULT '0',
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `room_id_date_UNIQUE` (`ota_homestay_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
這裡邊有一行資料:
replace方案:
replace into table1 (ota_homestay_id, date, price, state, inventory)
values ('10004987159', '2019-03-06', 600, 1, 1);
每次執行ctime和mtime這兩個時間欄位都會變更,而且相等
duplicate方案
insert into homestay_ota_xiaozhu_price_calendar (ota_homestay_id, date, price, state, inventory)
value ('10004987159', '2019-03-06', 700, 1, 1)
on duplicate key update ota_homestay_id ='10004987159',
date ='2019-03-06',
price =700,
state =1,
inventory =1;
紅色部分欄位值一般情況下要求一致,特殊情況特殊對待
執行該語句,每次如果有資料就update執行on duplicate key update後面的資料更新。從時間欄位上看每次如果有資料更新mtime會變化,沒有資料更新mtime不變。和update語句行為一致