绥化网站建设公司,seo网站推广工作内容,wordpress本站只对会员开放,有阿里空间怎么做网站【REDME】
有些业务场景如下#xff1a;
对于数据已经存在的#xff0c;则更新#xff1b;否则新增#xff1b;
怎么判定数据已经存在#xff0c;通过主键或唯一索引来判断#xff1b;
业务场景#xff1a;业务库的全局参数表的参数值的新增或更新就是 有则更细无则…【REDME】
有些业务场景如下
对于数据已经存在的则更新否则新增
怎么判定数据已经存在通过主键或唯一索引来判断
业务场景业务库的全局参数表的参数值的新增或更新就是 有则更细无则插入的常见业务场景 【1】2种实现方式
通常情况下我们是先select判断数据是否存在若不存在则新增否则更新
要完成这个小小功能我们需要写3条sql非常麻烦
采用2种简单方式只需要写1条sql
方式1 duplicate key insert into ...... on duplicate key update ...方式2replace into【1.1】duplicate key update
0. duplicate 官方文档翻译参见 https://blog.csdn.net/PacosonSWJTU/article/details/120058725
1.duplicate顾名思义有重复键则更新否则插入
2.语法如下
如果指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值则会发生旧行的 UPDATE。 例如如果列 a 声明为 UNIQUE 并包含值 1则以下两个语句具有类似的效果 INSERT INTO t1 (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE cc1;UPDATE t1 SET cc1 WHERE a1;
3.测试案例
-- 表结构
CREATE TABLE my_cust_warn_tbl (rcrd_id varchar(64) NOT NULL COMMENT 记录编号,cust_num varchar(50) NOT NULL COMMENT 客户号,cust_name varchar(50) DEFAULT COMMENT 客户姓名,warn_times int(11) DEFAULT NULL COMMENT 客户预警次数,create_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT 创建时间,last_modify_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT 最后修改时间,PRIMARY KEY (rcrd_id),UNIQUE KEY uni_cust_num (cust_num)
) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT客户预警表
注意 使用duplicate语法的数据库表一定要设置唯一索引以便于判断数据是否存在
统计客户的预警次数很显然就是有着更新没有则新增
INSERT INTO
mybatis.my_cust_warn_tbl (rcrd_id, cust_num, cust_name, warn_times)
VALUES(hand_11, hand_11_custnum, hand_11_custname, 0)
on duplicate key update warn_timeswarn_times1, create_time current_timestamp
;
第一次执行上述sql由于 hand_11_cust 不存在则返回条数是1 第二次执行SQL如下 注意第一次与第二次的sql不一样主键不同但客户号相同客户号是唯一索引
INSERT INTO
mybatis.my_cust_warn_tbl (rcrd_id, cust_num, cust_name, warn_times)
VALUES(hand_11_2, hand_11_custnum, hand_11_custname, 0)
on duplicate key update warn_timeswarn_times1, create_time current_timestamp
;由于 hand_11_cust 已经存在更新条数返回2 【1.2】replace into
1.replace顾名思义替换有则先删除后插入没有则直接插入
步骤为
step1delete 存在的记录通过主键或唯一索引来判断step2重新插入新值
为了演示效果我们新建了一个主键自增的数据库表
drop table if exists my_cust_warn_autopk_tbl
;
CREATE TABLE my_cust_warn_autopk_tbl (rcrd_id int primary key not null auto_increment COMMENT 记录编号,cust_num varchar(50) NOT NULL COMMENT 客户号,cust_name varchar(50) DEFAULT COMMENT 客户姓名,warn_times int(11) DEFAULT NULL COMMENT 客户预警次数,create_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT 创建时间,last_modify_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT 最后修改时间,UNIQUE KEY uni_cust_num (cust_num)
) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT客户预警表自增
;2. 测试案例
REPLACE INTO
mybatis.my_cust_warn_autopk_tbl (cust_num, cust_name, warn_times)
VALUES(hand_12_custnum, hand_12_custname, 0)
; 因为之前没有存在的数据故更新行数为1 刚刚插入的记录的主键值为1 如下 接着 我们把客户姓名字段设置为null看下 发现更新行数为2
REPLACE INTO
mybatis.my_cust_warn_autopk_tbl (cust_num, cust_name, warn_times)
VALUES(hand_12_custnum, null, 0)
; 我们看下数据长什么样子仅有一个 主键值为2的记录存在
很显然因为存在客户号为 hand_12_custnum的记录于是先删除了 主键为1的记录然后再插入主键为2的记录如下 当然了通过两次sql的 create_time 也可以判断出 第2次replace是 删除旧记录然后重新新增一条数据而不是在旧记录上修改 因为 两次的create_time 不一样 【2】 两者执行时间简单对比
show variables like %pro%;
set profiling1;
show profiles ;