创建一个合适的表,表中必须有唯一索引,因为更新的时候就依据唯一索引更新的
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;
编写sql测试
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数据库为我们做了一层是否存在的判断,所以我们就不用先判断是否存在再更新还是插入。使用驱动包中特有的操作接口,传入对应的参数即可。
注意:这个写法有个问题,如果是批量提交插入或更新数据,那么自增的id字段会提前预留出批量数量大小的id区段,会导致自增id值不连续增加,所以使用这种方式时,最好是单条提交,防止id自增断断续续。