假如student表的结构如下:

CREATE TABLE `student` (
  `student_id` int NOT NULL,
  `student_name` varchar(50),
  `score` decimal(5,2) DEFAULT NULL,
  `teacher_id` int,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

向表中所有字段插入数据

语法如下:

insert into 表名 values(第1个字段的值,第2个字段的值,...);

示例:

insert into student values(1,'张三',82.5,4);

由于没有指定插入目标表的字段名和字段顺序,因为values后的值的个数、数据类型与顺序,必须与表结构中一致。

向表中指定字段插入数据

语法如下:

insert into 表名(字段1,字段2,...) values(第1个字段的值,第2个字段的值,...);

示例:

insert into student(student_id,student_name) values(1,'张三');

对于未指定值的字段,将会使用默认值赋值。如果没有设置默认值,则使用NULL值赋值。如果字段被设置为不允许NULL,此时会报错。

被设置为auto_increment的字段,不需要指定值,会使用自增序号自动赋值。

一次插入多条数据

语法如下:

insert into 表名(字段1,字段2,...) 
values(第1个字段的值,第2个字段的值,...),(第1个字段的值,第2个字段的值,...),(第1个字段的值,第2个字段的值,...)...;

示例:

insert into student(student_id,student_name) 
values(1,'张三'),(2,'李四'),(3,'王五');

对于数据库来说,一次插入的数据条数并不是可以无限大的。这受数据库允许的最大的包大小限制。

使用show variables like ‘max_allowed_packet’命令可以查看数据库允许的最大的包大小。

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
1 row in set, 1 warning (0.01 sec)

上面的查询结果表示,一条SQL允许的最大大小为4M。注意:这里的4M指的是SQL语句文本占用的存储空间大小,而不是允许的数据条数。允许的数据条数需要根据单条数据的大小来计算。比如,单条数据大小为1K,那么一条SQL允许的最大数据条数为4M/1K=4*1024K/1K=4096条。

复制另一个表的数据

语法如下:

insert into 目标表名(字段1,字段2,...)
select 字段1,字段2,...
from 源表名;

示例:

insert into school.student(student_id,student_name)
select student_id,student_name
from school.studetn_bak;

根据查询结果插入数据

语法如下:

insert into 目标表名(字段1,字段2,...)
select 查询语句;

示例:

insert into school.student(student_id,student_name)
select student_id,student_name
from school.studetn_bak
where age > 10;
picture loss