mysql insert or update_MySQL insert or update SQL 示例

创建一个合适的表,表中必须有唯一索引,因为更新的时候就依据唯一索引更新的

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自增断断续续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值