
4.1 插入数据
在使用数据库之前,数据库中必须要有数据,MySQL中使用INSERT语句向数据库表中插入新的数据记录。可以插入的方式有:插入完整的记录、插入记录的一部分、插入多条记录、插入另一个查询的结果。下面将分别介绍这些内容。
4.1.1 为表的所有字段插入数据
使用基本的INSERT语句插入数据要求指定表名称和插入新记录中的值。基本语法格式为:
INSERT INTO table_name (column_list) VALUES (value_list);
table_name指定要插入数据的表名,column_list指定要插入数据的那些列,value_list指定每个列对应插入的数据。注意,使用该语句时字段列和数据值的数量必须相同。
本章将使用样例表person,创建语句如下:

向表中所有字段插入值的方法有两种:一种是指定所有字段名;另一种是完全不指定字段名。
【例4.1】在person表中插入一条新记录,id值为1,name值为Green,age值为21,info值为Lawyer,SQL语句如下:
执行插入操作之前,使用SELECT语句查看表中的数据:

结果显示当前表为空,没有数据。接下来执行插入操作:

语句执行完毕,查看执行结果:

可以看到插入记录成功。在插入数据时,指定了person表的所有字段,因此将为每一个字段插入新的值。
INSERT语句后面的列名称顺序可以不是person表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以,如【例4.2】所示。
【例4.2】在person表中插入一条新记录,id值为2,name值为Suse,age值为22,info值为dancer,SQL语句如下:

语句执行完毕,查看执行结果:

由结果可以看到,INSERT语句成功插入了一条记录。
使用INSERT插入数据时,允许列名称列表column_list为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同,如【例4.3】所示。
【例4.3】在person表中插入一条新记录,id值为3,name值为Mary,age值为24,info值为Musician,SQL语句如下:
mysql> INSERT INTO person VALUES (3,'Mary', 24, 'Musician');
语句执行完毕,查看执行结果:

可以看到插入记录成功。数据库中增加了一条id为3的记录,其他字段值为指定的插入值。本例的INSERT语句中没有指定插入列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和person表中字段定义的顺序相同。
提示
虽然使用INSERT插入数据时可以忽略插入数据的列名称,但是值如果不包含列名称,那么VALUES关键字后面的值不仅要求完整,而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,那么对列进行增加、删除或者位置改变操作,这些操作将使得用这种方式插入数据时的顺序也同时改变。如果指定列名称,则不会受到表结构改变的影响。
4.1.2 为表的指定字段插入数据
为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
【例4.4】在person表中插入一条新记录,name值为Willam,age值为20,info值为sports man,SQL语句如下:

提示信息表示插入一条记录成功。使用SELECT查询表中的记录,查询结果如下:

可以看到插入记录成功。如查询结果显示,该id字段自动添加了一个整数值4。在这里id字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,那么MySQL将插入该字段定义时的默认值。下面的例子说明在没有指定列字段时,插入默认值。
【例4.5】在person表中插入一条新记录,name值为Laura,age值为25,SQL语句如下:
mysql> INSERT INTO person (name, age ) VALUES ('Laura', 25);
语句执行完毕,查看执行结果,

可以看到,在本例的插入语句中,没有指定info字段值,查询结果显示,info字段在定义时默认为NULL,因此系统自动为该字段插入空值。
提示
要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,就无法插入,并且MySQL会产生错误。
4.1.3 同时插入多条记录
INSERT语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:

value_list1,value_list2,…,value_listn;表示第1,2,…,n个插入记录的字段的值列表。
【例4.6】在person表中,在name、age和info字段指定插入值,同时插入3条新记录,SQL语句如下:

语句执行完毕,查看执行结果:

由结果可以看到,INSERT语句执行后,person表中添加了3条记录,其name和age字段分别为指定的值,id字段为MySQL添加的默认自增值。
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
• Records:表明插入的记录条数。
• Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含重复的主键值。
• Warnings:表明有问题的数据值,例如发生数据类型转换。
【例4.7】在person表中,不指定插入列表,同时插入两条新记录,SQL语句如下:

语句执行结果如下:

语句执行完毕,查看执行结果:

由结果可以看到,INSERT语句执行后,person表中添加了两条记录,与前面介绍单个INSERT语法不同,person表名后面没有指定插入字段列表,因此,VALUES关键字后面的多个值列表都要为每一条记录的每一个字段列指定插入值,并且这些值的顺序必须和person表中字段定义的顺序相同,带有AUTO_INCREMENT属性的id字段插入NULL值,系统会自动为该字段插入唯一的自增编号。
提示
一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快,所以在插入多条记录时,最好选择使用单条INSERT语句的方式插入。
4.1.4 将查询结果插入表中
INSERT语句用来给数据表插入记录时,指定插入记录的列值。INSERT还可以将SELECT语句查询的结果插入表中,如果想要从另一个表中合并个人信息到person表,那么不需要把每一条记录的值一个一个输入,只需要使用一条INSERT语句和一条SELECT语句组成的组合语句,即可快速地从一个或多个表中向一个表中插入多个行。基本语法格式如下:

table_name1指定待插入数据的表;column_list1指定待插入表中要插入数据的哪些列;table_name2指定插入数据是从哪个表中查询出来的;column_list2指定数据来源表的查询列,该列表必须和column_list1列表中的字段个数相同,数据类型相同;condition指定SELECT语句的查询条件。
【例4.8】从person_old表中查询所有的记录,并将其插入person表中。
首先,创建一个名为person_old的数据表,其表结构与person表结构相同,SQL语句如下:

向person_old表中添加两条记录:

可以看到,插入记录成功,person_old表中现在有两条记录。接下来,将person_old表中所有的记录插入person表中,SQL语句如下:

语句执行完毕,查看执行结果:

由结果可以看到,INSERT语句执行后,person表中多了两条记录,这两条记录和person_old表中的记录完全相同,数据转移成功。这里的id字段为自增的主键,在插入的时候要保证该字段值的唯一性,如果不能确定,那么在插入的时候可以忽略该字段,只插入其他字段的值。
提示
这个例子中使用的person_old表和person表的定义相同。事实上,MySQL不关心SELECT返回的列名,它根据列的位置进行插入,SELECT的第1列对应待插入表的第1列,第2列对应待插入表的第2列,等等。即使不同结果的表之间也可以方便地转移数据。