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! 测试