当前位置:Gxlcms > mysql > MYSQL基础01(新增,修改,删除)_MySQL

MYSQL基础01(新增,修改,删除)_MySQL

时间:2021-07-01 10:21:17 帮助过:14人阅读

INSERT

1.插入一条记录 ,很简单的标准sql

insert into mytable(col1,col2,col3) values('val1','val2',4);

说明:请留意最后的分号; 用惯了mssql ,最不适应的地方就是,mysql中每条sql语句必须用分号间开,否则如果想一次执行多条语句,就会报错.

另外,如果使用自增ID,插入时也可以设置自增ID的值,而不报错; 这对于数据迁移是一大方便.

2.复制表的数据,这跟mssql是一样的

insert into mytable(col1,col2,col3)

select col1,col2,col3 from copytable;

3.新增表并同时复制数据,这个跟mssql不同 (ms:select * into newtable from copytable)

CREATE TABLE newtable SELECT * FROM copytable WHERE 1=2;

说明:跟mssql一样,只是单纯复制表结构,索引什么的并不会复制过来; 去掉where 条件将会复制所有数据

4.批量插入,mysql的特点,有点似链式写法 (相当好用!)

insert into mytable (col1,col2,col3) values ('A','VAL1',1),('B','VAL2',2),('C','VAL3',3);

说明:执行效率相当高,同时插入数万记录也只是10秒以内;而且对于项目中的处理字符,实现批量插入相当轻松,我特别喜欢这个语句.

UPDATE

1.标准sql

UPDATE mytable SET col1='A',col2='val1',col3=1 where id='0001';

2.表连接更新,同时更新多列,部分跟mssql一致

UPDATE newtable a,oldtable b set a.col1=b.col1,a.col2=b.col2 where a.id=b.id;

说明:mssql的写法更加灵活,支持该写法: update newtable set col1=oldtabel.col1,col2=oldtabel.col2 from oldtabel where newtable.id=oldtabel.id

3.批量更新

REPLACE INTO mytable (id,name)VALUES ('01','hello'),('02','haha');

说明:跟批量插入的格式是一样的, 当values后面的数据插入到mytable中不会引起主键冲突或唯一索引冲突时,那么就会直接新增数据, 否则就会修改数据.简单点说就是,如果记录存在则更新,如果记录不存在则插入; 上例中,如果执行插入操作,受影响行数为2, 如果执行修改操作,受影响行数为4; 所以执行修改操作的本质是先delete,然后再插入.所以如果更新的字段不齐,其它字段将变为默认值 下面是该功能的增强版

INSERT INTO mytable(id,name,col)VALUES (78,'456','55'),(88,'456','d') ON DUPLICATE KEY UPDATE name=VALUES(name),col=VALUES(col);

INSERT INTO mytable(id,name,col)VALUES (78,'456','55'),(88,'456','d') ON DUPLICATE KEY UPDATE name=VALUES(name); --只更新name

说明:跟replace 是一样的,唯一不同的是可以选择更新的列, 其它的列的值并不会受影响.

DELETE

1.标准sql

delete from mytable where id='001';

2.清空表, 跟mssql是一样的

truncate table mytable;

说明:执行后,自增ID也会从1开始编号.

处理数据时注意事项

1.对日期类型的列插入数据时,如果插入的值不符合日期格式,mysql 并不会报错,但是会保存为'0000-00-00 00:00:00'的格式, 一般的程序并不会承认,所以你会发现后台读取数据没有问题,而应用程序读取数据时会报错. 这个我被坑惨了.

下面是网上找到的解决办法,并没有实际测试

给jdbc url加上 zeroDateTimeBehavior参数:

datasource.url=jdbc:mysql://localhost:3306/testdbuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true

zeroDateTimeBehavior=round是为了指定MySql中的DateTime字段默认值查询时的处理方式;默认是抛出异常,

对于值为0000-00-00 00:00:00(默认值)的纪录,如下两种配置,会返回不同的结果:

zeroDateTimeBehavior=round //结果: 0001-01-01 00:00:00.0

zeroDateTimeBehavior=convertToNull //结果 null

目前关于mysql的新增更新删除就是以上内容,遇到新情况再补充吧

人气教程排行