16.1 插入数据
在使用数据库之前,数据库中必须要有数据,MySQL中使用INSERT语句向数据表中插入新的数据记录。可以插入的方式有:插入完整的记录,插入记录的一部分,插入多条记录,以及插入另一个查询的结果。下面将介绍这些内容。
16.1.1 为表的所有字段插入数据
使用基本的INSERT语句插入数据要求指定表的名称和插入到新记录中的值。基本语法格式为:
INSERT INTO table_name (column_list) VALUES (value_list);
table_name指定要插入数据的表名,column_list指定要插入数据的那些列,value_list指定每个列对应插入的数据。注意,使用该语句时字段列和数据值的数量必须相同。
本章将使用样例表person,创建语句如下:
CREATE TABLE person ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(40) NOT NULL DEFAULT '', age INT NOT NULL DEFAULT 0, info CHAR(50) NULL, PRIMARY KEY (id) );
向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。
【例16.1】在表person中,插入一条新记录,id值为1,name值为Green,age值为21,info值为lawyer,SQL语句如下:
执行插入操作之前,使用SELECT语句查看表中的数据:
mysql> SELECT * FROM person; Empty set (0.00 sec)
结果显示当前表为空,没有数据,接下来执行插入操作:
mysql> INSERT INTO person (id ,name, age , info) -> VALUES (1,'Green', 21, 'Lawyer'); Query OK, 1 row affected (0.00 sec)
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
+---- | +-------- | +----- | +------------+ |
1 | Green | 21 | Lawyer |
+---- | +-------- | +----- | +------------+ |
可以看到插入记录成功。在插入数据时,指定了表person的所有字段,因此将为每一个字段插入新的值。
INSERT语句后面的列名称顺序可以不是表person定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以,如下面的例子。
【例16.2】在表person中,插入一条新记录,id值为2,name值为Suse,age值为22,info值为dancer,SQL语句如下:
mysql> INSERT INTO person (age ,name, id , info) -> VALUES (22, 'Suse', 2, 'dancer');
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
+---- | +-------- | +----- | +------------+ |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
+---- | +-------- | +----- | +------------+ |
由结果可以看到,INSERT语句成功插入了一条记录。
使用INSERT插入数据时,允许列名称列表column_list为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
【例16.3】在表person中,插入一条新记录,SQL语句如下:
mysql> INSERT INTO person -> VALUES (3,'Mary', 24, 'Musician'); Query OK, 1 row affected (0.00 sec)
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
3 | Mary | 24 | Musician |
+---- | +-------- | +----- | +------------+ |
可以看到插入记录成功。数据库中增加了一条id为3的记录,其他字段值为指定的插入值。本例的INSERT语句中没有指定插入列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和表person中字段定义的顺序相同。
提 示
虽然使用INSERT插入数据时可以忽略插入数据的列名称,但是如果不包含列名称,那么VALUES关键字后面的值不仅要求必须完整而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,则对列进行增加、删除或者位置改变操作,将使得用这种方式插入数据时的顺序也必须同时改变。如果指定列名称,则不会受到表结构改变的影响。
16.1.2 为表的指定字段插入数据
为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
【例16.4】在表person中,插入一条新记录,name值为Willam,age值为20,info值为sports man,SQL语句如下:
mysql> INSERT INTO person (name, age,info) -> VALUES('Willam', 20, 'sports man'); Query OK, 1 row affected (0.00 sec)
提示信息表示插入一条记录成功。使用SELECT查询表中的记录,查询结果如下:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
+---- | +-------- | +----- | +------------+ |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
3 | Mary | 24 | Musician |
4 | Willam | 20 | sports man |
+---- | +-------- | +----- | +------------+ |
可以看到插入记录成功。如这里的id字段,查询结果显示,该字段自动添加了一个整数值4。在这里id字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,MySQL将插入该字段定义时的默认值。下面例子说明在没有指定列字段时,插入默认值。
【例16.5】在表person中,插入一条新记录,name值为Laura,age值为25,SQL语句如下:
mysql> INSERT INTO person (name, age ) VALUES ('Laura', 25); Query OK, 1 row affected (0.00 sec)
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
+---- | +-------- | +----- | +------------+ |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
3 | Mary | 24 | Musician |
4 | Willam | 20 | sports man |
5 | Laura | 25 | NULL |
+---- | +-------- | +----- | +------------+ |
可以看到,在本例插入语句中,没有指定info字段值,查询结果显示,info字段在定义时指定默认值为NULL,因此系统自动为该字段插入空值。
提 示
要保证每个插入值的类型必须和对应列的数据类型匹配,如果类型不同,将无法插入,并且MySQL会产生错误。
16.1.3 同时插入多条记录
INSERT语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:
INSERT INTO table_name (column_list) VALUES (value_list1), (value_list2),...,(value_listn);
“value_list1,value_list2,…value_listn;”分别表示第n个插入记录的字段的值列表。
【例16.6】在表person中,在name、age和info字段指定插入值,同时插入3条新记录,SQL语句如下:
INSERT INTO person(name, age, info) VALUES ('Evans',27, 'secretary'), ('Dale',22, 'cook'), ('Edison',28, 'singer');
语句执行结果如下:
mysql> INSERT INTO person(name, age, info) -> VALUES ('Evans',27, 'secretary'), -> ('Dale',22, 'cook'), -> ('Edison',28, 'singer'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +-------- | +----- | +------------+ |
id | name | age | info |
+---- | +-------- | +----- | +------------+ |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
3 | Mary | 24 | Musician |
4 | Willam | 20 | sports man |
5 | Laura | 25 | NULL |
6 | Evans | 27 | secretary |
7 | Dale | 22 | cook |
8 | Edison | 28 | singer |
+---- | +-------- | +----- | +------------+ |
由结果可以看到,INSERT语句执行后,表person中添加了3条记录,其name和age字段分别为指定的值,id字段为MySQL添加的默认的自增值。
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些包含数值的字符串的意思分别如下。
•Records:表明插入的记录条数。
•Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
•Warnings:表明有问题的数据值,例如发生数据类型转换。
【例16.7】在表person中,不指定插入列表,同时插入两条新记录,SQL语句如下:
INSERT INTO person VALUES (9,'Harry',21, 'magician'), (NULL,'Harriet',19, 'pianist');
语句执行结果如下:
mysql> INSERT INTO person -> VALUES (9,'Harry',21, 'magician'), -> (NULL,'Harriet',19, 'pianist'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+---- | +--------- | +----- | +------------+ |
id | name | age | info |
1 | Green | 21 | Lawyer |
2 | Suse | 22 | dancer |
3 | Mary | 24 | Musician |
4 | Willam | 20 | sports man |
5 | Laura | 25 | NULL |
6 | Evans | 27 | secretary |
7 | Dale | 22 | cook |
8 | Edison | 28 | singer |
9 | Harry | 21 | magician |
10 | Harriet | 19 | pianist |
+---- | +--------- | +----- | +------------+ |
由结果可以看到,INSERT语句执行后,表person中添加了两条记录,与前面介绍单个INSERT语法不同,person表名后面没有指定插入字段列表,因此VALUES关键字后面的多个值列表都要为每一条记录的每一个字段列指定插入值,并且这些值的顺序必须和表person中字段定义的顺序相同,带有AUTO_INCREMENT属性的id字段插入NULL值,系统会自动为该字段插入唯一的自增编号。
提 示
一个同时插入多行记录的INSERT语句可以等同于多个单行插入的INSERT语句,但是同时插入多行的INSERT语句在处理过程中效率更高。所以在插入多条记录时,最好选择使用单条INSERT语句的方式插入。