雪洗中关村

导航

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 语法的原因:
1replace into 遇到已存在的记录,会先删除掉表中原有的记录后,再插入新的记录,
这样会导致该记录的主键发生变化,如果该表的主键和其它表有业务关联,那么会导致关联数据丢失。
2replace 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添加和删除唯一索引、主键

1PRIMARY KEY(主键索引)
添加 ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` );
删除 ALTER TABLE `table_name` DROP PRIMARY KEY;

2UNIQUE(唯一索引)
添加 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————————————————————

 

posted on 2018-12-08 10:33  雪洗中关村  阅读(169)  评论(0编辑  收藏  举报