且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MySQL插入数据(六)下

更新时间:2022-05-19 10:39:00

三. 批量插入多条记录


命令:


    insert into 表名(列名1,列名2...列名n) values (属性值11,属性值12...属性值1n),(属性值21,属性值22...属性值2n),
    (属性值n1,属性值n2...属性值nn);


三.一 插入全部正确的多条数据


只插入 name值吧。 其他值均用 自动自动,默认约束值,和默认值来填充。


    insert into user(name) values('张三'),('李四'),('王二');


MySQL插入数据(六)下


批量插入时,相比较单条数据插入,多了一些其他的信息。


Records: 插入的记录条数


Duplicates: 插入时被忽略的记录,如 主键重复错误


Warnings: 有问题的数据值,如数据类型转换错误


三.二 插入部分有错误的数据


用 name 和age 吧。 接下来的自动增长值,应该是 111


插入的数据,有正确的,也有错误的, 看怎么处理。


    insert into user(name,age) values ('aa',24),('bb',24),(null,25),(null,26),('cc',24),('cc','年龄');


MySQL插入数据(六)下


会发现,仍然将错误的数据填入进去了。要特别记忆,是插入进去了,并不是回滚了 全部没有数据,也不是只插入正确的数据,不插入错误的数据。 最后一条的 (‘cc’,‘年龄’) 时,年龄用 0进行替换。 (null,25),(null,26) 的name值 被 空字符串 替换。


MySQL插入数据(六)下


在 用navicat 等数据库工具 批量导入表结构和表数据时,常常会发生这种情况。


四. 插入另一个查询的结果


命令:


    insert into 要插入数据的表名A(A表里列名1, A表里列名2...A表里列名n)
    select 查询表B列名1,查询表列名2...查询表B列名n from 查询表B [where 条件 [order by 排序]]


其中, 一定要保证:


1 .(A表里列名1, A表里列名2…A表里列名n) 可以正确的插入到数据库里, 如 user中 name是非空约束,那么在 列表里面一定要有 name列进行插入。


2 . 两个表 A 与 B 不一定要是完全相同的表 (列一样,并且列顺序一样),只要保证 (A表里列名1, A表里列名2…A表里列名n) 与 查询表B列名1,查询表列名2…查询表B列名n 列表数目一致,并且数据类型顺序一致,列名存储长度 表名A>表名B. 不需要列名一样。


3 . 其实,上面的 命令 就相当于第三部分的命令一样, 也属于 批量插入表。


    insert into 要插入数据的表名A(A表里列名1, A表里列名2...A表里列名n) values (查询B表 第一条结果), (查询B表 第二条结果)
    ...(查询B表 第n条结果)


四.一 插入全部正确的结果集


新创建一个表 newUser 表, 里面只有 user 表的三个类似属性 id,name,age, 但在newUser 表里面叫 id,newName,newAge . 其中newName的长度是30,不是20.


1 .创建表


    create table newUser(
        id int(11) primary key auto_increment,
        newName varchar(30),
        newAge int(3)
    );


MySQL插入数据(六)下


2 .插入数据


    insert into newUser(id,newName,newAge) select id,name,age from user;


MySQL插入数据(六)下


3 .查询新表的数据


MySQL插入数据(六)下


发现,将所有的 记录都插入到 newUser 表里面了。


四.二 插入有部分数据错误的结果集


新创建一个表 newUser2 表, 里面只有 user 表的三个类似属性 id,name,age, 但在newUser2 表里面叫 id,newName,newAge . 其中newName的长度是30,不是20,并且 newName是唯一约束。 (很显然,user表中name有重复的名称,插入时会触犯 newName 唯一性约束)


1 .创建表


    create table newUser2(
        id int(11) primary key auto_increment,
        newName varchar(30) unique,
        newAge int(3)
    );


MySQL插入数据(六)下


2 .插入数据, 会发现 插入时会报错,没有插入任何数据。


    insert into newUser2(id,newName,newAge) select id,name,age from user;


MySQL插入数据(六)下


MySQL插入数据(六)下


唯一约束起作用了。同样,主键约束插入时也会起作用。


3 . 数据类型长度不一致。 如将 newName的长度设置为 4. user中有name的长度超过了4,如两个蝴蝶飞


     alter table newUser2 drop index newName;
     alter table newUser2 modify newName varchar(4);
    insert into newUser2(id,newName,newAge) select id,name,age from user;
    


MySQL插入数据(六)下


会发现,报错了。 第一行的长度超过了限制。


第一行的时候,不知道原先的数据有没有插入, 故改变一下name的值。


MySQL插入数据(六)下


发现,也没有任何数据插入。


4 . 数据类型不一致。 如将 newName 由 varchar(4) 变成 int(11)


    alter table newUser2 modify newName int(11);
    insert into newUser2(id,newName,newAge) select id,name,age from user;


MySQL插入数据(六)下


也没有插入任何数据。


这就是 插入数据的基本用法。


谢谢!!!