mysql 【常用sql - ddl、dml】
on duplicate key update:
MySQL on duplicate key update 批量插入并更新已存在数据 https://www.cnblogs.com/funsion/p/11432758.html
业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败。
因此需要事先判断哪些数据是重复的,哪些是新增的。
比较常用的处理方法就是找出已存在的数据,并将其与不存在的数据区分开,已存在的数据一条条的更新。不存在的数据则批量更新。
这种方法会导致代码逻辑复杂,同时严重降低代码效率。
为了应对这种业务场景,MySQL有一种专有语法(insert into ... on duplicate key update)批量插入并更新唯一键数据
CREATE TABLE `user_card` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`uid` int(10) DEFAULT '0' COMMENT '用户ID',
`grade_id` int(10) DEFAULT '0' COMMENT '等级ID',
`name` varchar(255) DEFAULT '' COMMENT '姓名',
`money` decimal(10,2) DEFAULT '0.00' COMMENT '余额',
PRIMARY KEY (`id`),
UNIQUE KEY `uid_gid` (`uid`,`grade_id`) -- 业务上的唯一键 uid + grade_id 确认一条唯一的记录
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
如上图所示,批量插入的数据,遇到已存在记录(根据唯一键,创表语句中的 UNIQUE KEY 判断)时,自动更新已有的数据。
其中 money字段 以数据库现有值为准不进行更新, name字段使用了关键字 VALUES() 以外部值为准进行更新。
如果表中有多个唯一键(可以是单列索引或复合索引),则任意一个唯一键(UNIQUE KEY)冲突时,都会自动更新数据。
通过 on duplicate key update 语法,可以指定哪些字段进行更新,哪些字段不进行更新。
所有操作均由SQL处理,不需要额外程序代码分析,能够大幅提高程序执行效率。
P.S:补充下不使用 replace into 语法的原因:
1、replace into 遇到已存在的记录,会先删除掉表中原有的记录后,再插入新的记录,
这样会导致该记录的主键发生变化,如果该表的主键和其它表有业务关联,那么会导致关联数据丢失。
2、replace into 插入的主键在某些时候不是连续自增的,这样会导致主键增长的数据很快,有时候会超过 int(10) 的最大值
https://www.cnblogs.com/zjdxr-up/p/8319982.html
MySQL c 批量插入并更新已存在数据
本文为博主原创,转载请注明出处。
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新,
在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有
ON DUPLICATE KEY UPDATE一步就可以完成,感觉实在是太方便了,
该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1,
下面两个语句会有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。
再现一个例子:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
修改过mysql数据库字段内容默认值为当前时间
--添加CreateTime 设置默认时间 CURRENT_TIMESTAMP
ALTER TABLE `table_name`
ADD COLUMN `CreateTime` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ;
https://www.cnblogs.com/testway/p/5531969.html
--修改CreateTime 设置默认时间 CURRENT_TIMESTAMP
ALTER TABLE `table_name`
MODIFY COLUMN `CreateTime` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ;
--添加UpdateTime 设置 默认时间 CURRENT_TIMESTAMP 设置更新时间为 ON UPDATE CURRENT_TIMESTAMP
ALTER TABLE `table_name`
ADD COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间' ;
--修改 UpdateTime 设置 默认时间 CURRENT_TIMESTAMP 设置更新时间为 ON UPDATE CURRENT_TIMESTAMP
ALTER TABLE `table_name`
MODIFY COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPCOMMENT '创建时间' ;
更新一个表中的某个字段值等于另一个表的某个字段值:
update a inner join b on a.bid=b.id set a.x=b.x,a.y=b.y ;
insert
INSERT INTO table1 (id, table1_field1,table1_field2,...) select table2_filed1, table2_field2,... from table2 where condition1 and condition2 ...;
INSERT INTO T1
( UserId, DepId, SubDepId, PostionType, AuthorityId, ChangeDateS, InsertDate, UpdateDate, SakuseiSyaId ) SELECT
UserId, DepId, SubDepId, PostionType, AuthorityId, DATE_FORMAT(EmployDate, '%Y%m%d'), NOW(), NOW(), uuid()
FROM T2 WHERE `Status` = 0 AND QuitFlg = 0 AND UserId < 2
INSERT INTO cpa_ticket_catalog_template
( id, book_id, catalog_id, summary, summary_type, catalog_name, templateSign, is_rest_by_tax, remarks, deleted, created, updated, spare) SELECT
REPLACE (UUID(), '-', ''), "", id, "", 2, NAME, "", 1, "", 0, now(), NOW(), ""
FROM cpa_ticket_catalog WHERE parent_id = "1804b3409118465e9438e83c1d97287b"
update当前表 字段 = 另一关联表的 字段
UPDATE T1 AS a1, T2 AS a2
SET a2._name=a1.name
WHERE a1.id='xxx' AND a1.id=a2.customerId
MySQL添加数据库的唯一索引的几种方式~
创建表时直接设置:
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`stu_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`stu_id`),
UNIQUE KEY `UK_student_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
创建唯一索引:
create unique index UK_student_name on student (name);
建表后添加约束:
alter table student add constraint uk_student_name unique (name);
Mysql添加和删除唯一索引、主键
1、PRIMARY KEY(主键索引)
添加 ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` );
删除 ALTER TABLE `table_name` DROP PRIMARY KEY;
2、UNIQUE(唯一索引)
添加 ALTER TABLE `table_name` ADD UNIQUE ( `column` );
删除 ALTER TABLE `table_name` DROP INDEX `column`;
————mysql分页——start————————————————————
int pageSize = pageVo.getPageSize();
int startPage = pageSize * (pageVo.getPageNum() - 1);
List<ProjectInfoVO> getProjectList(@Param("startPage") int startPage, @Param("pageSize") int pageSize, @Param("gender") int gender);
<select id="getUerList" resultType="xx.xx.">
select
<include refid="baseColumns"/>
from user
where gender = #{gender}
limit #{startPage}, #{pageSize}
</select>
————mysql分页——end————————————————————