CREATE TABLE `biz_fund_split` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `security_id` VARCHAR(40) NOT NULL COMMENT '基金ID', `security_code` VARCHAR(40) NOT NULL COMMENT '基金代碼', `the_date` DATE NOT NULL COMMENT '生效日期', `split_date` DATE NOT NULL COMMENT '拆分日期', `split_object` VARCHAR(200) NULL DEFAULT NULL COMMENT '拆分對象', `split_mode` VARCHAR(100) NULL DEFAULT NULL COMMENT '拆分類型', `split_rate` DECIMAL(20,4) NULL DEFAULT NULL COMMENT '拆分比例', `split_before_value` DECIMAL(20,4) NULL DEFAULT NULL COMMENT '拆分前淨值', `split_before_share` DECIMAL(20,4) NULL DEFAULT NULL COMMENT '拆分前份額', `split_after_share` DECIMAL(20,4) NULL DEFAULT NULL COMMENT '拆分後份額', `remark` VARCHAR(200) NULL DEFAULT NULL COMMENT '備註', `last_modified_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '記錄時間戳', PRIMARY KEY (`id`), UNIQUE INDEX `idx_security_code_the_date` (`security_code`, `the_date`) ) COMMENT='基金拆分與折算表' COLLATE='utf8_general_ci' ENGINE=MyISAM AUTO_INCREMENT=23;
insert into biz_fund_split (security_id, security_code, the_date, split_date, split_object, split_mode, split_rate, split_before_value, split_before_share, split_after_share, remark) values (?,?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE security_id=VALUES(security_id), split_date=VALUES(split_date), split_object=VALUES(split_object), split_mode=VALUES(split_mode), split_rate=VALUES(split_rate), split_before_value=VALUES(split_before_value), split_before_share=VALUES(split_before_share), split_after_share=VALUES(split_after_share), remark=VALUES(remark)
結合兩個sql能夠得出結論:ON DUPLICATE KEY UPDATE以後的字段少了UNIQUE INDEX中涉及的兩個字段,判斷insert仍是update,是以這兩個是否存在爲標準,若是存在,即以這兩個字段爲update條件,更新其餘的字段;若是不存在則直接插入。MySQL數據庫爲咱們作了一層是否存在的判斷,因此咱們就不用先判斷是否存在再更新仍是插入。使用驅動包中特有的操做接口,傳入對應的參數便可。sql
注意:這個寫法有個問題,若是是批量提交插入或更新數據,那麼自增的id字段會提早預留出批量數量大小的id區段,會致使自增id值不連續增長,因此使用這種方式時,最好是單條提交,防止id自增斷斷續續。數據庫
over! 測試