3.插入数据
1.插入数据
在mysql中,可以使用INSERT语句向数据库表中插入数据记录,插入数据的方式有:插入完整的记录,插入记录的一部分,插入另一个查询的结果。
1.1 为表的所有字段插入数据
使用基本的INSERT语句插入数据要求指定表名称和插入到记录中的值,基本语法格式为:
INSERT INTO table_name (column_list) VALUES (value_list);
table_name指定要插入数据的表名,column_list指定要插入数据的列,,value_list指定每个列要插入的数据。注意,使用该语句时字段列和数据值的数量必须相同。
以表person为例进行介绍,创建语句如下:
mysql> 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)
-> );
Query OK, 0 rows affected (0.92 sec)
向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。
例:
在person表中插入一条新记录,id值为1,name值为Green,age值为21,info值为Lawyer。
执行插入操作之前,使用SELECT语句查看表中的数据:
mysql> SELECT * FROM person;
Empty set (0.23 sec)
结果显示当前表为空,没有数据,接下来执行插入操作:
mysql> INSERT INTO person (id,name,age,info)
-> VALUES (1,'Green',21,'Lawyer');
Query OK, 1 row affected (0.13 sec)
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+----+-------+-----+--------+
| id | name | age | info |
+----+-------+-----+--------+
| 1 | Green | 21 | Lawyer |
+----+-------+-----+--------+
1 row in set (0.00 sec)
可以看到插入记录成功。在插入数据时,指定了person表的所有字段,因此将为每一个字段插入新的值。
INSERT语句后面的列名称顺序可以不是person表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以,如下:
例2:
在person表中,插入一条新记录,id值为2,name值为Suse,age值为22,info值为dancer,SQL语句如下:
mysql> INSERT INTO person (age,name,id,info)
-> VALUES (22,'Suse',2,'dancer');
Query OK, 1 row affected (0.14 sec)
语句执行完毕,查看执行结果:
mysql> SELECT * FROM person;
+----+-------+-----+--------+
| id | name | age | info |
+----+-------+-----+--------+
| 1 | Green | 21 | Lawyer |
| 2 | Suse | 22 | dancer |
+----+-------+-----+--------+
2 rows in set (0.00 sec)
由结果可以看到,INSERT语句成功插入了一条记录。
使用INSERT插入数据时,允许列名column_list为空,此时,需要为表的每一个字段指定值,并且值的顺序必须和数据表定义字段时的顺序相同:
mysql> INSERT person
-> VALUES (3,'Mary',24,'Musician');
Query OK, 1 row affected (0.12 sec)
mysql> SELECT * FROM person;
+----+-------+-----+----------+
| id | name | age | info |
+----+-------+-----+----------+
| 1 | Green | 21 | Lawyer |
| 2 | Suse | 22 | dancer |
| 3 | Mary | 24 | Musician |
+----+-------+-----+----------+
3 rows in set (0.00 sec)
1.2 为表的指定字段插入数据
为表的指定字段插入数据,就是用INSERT语句为部分字段插入值,而其他字段的值为定义表时的默认值:
mysql> INSERT INTO person (name,age,info)
-> VALUES ('Willam',20,'sports man');
Query OK, 1 row affected (0.14 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 |
+----+--------+-----+------------+
4 rows in set (0.00 sec)
查询结果显示,id字段自动添加了一个整数值4.在这里,id字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,MySQL将插入定义该字段时的默认值:
mysql> INSERT INTO person (name,age) VALUES ('Laura',25);
Query OK, 1 row affected (0.36 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 |
+----+--------+-----+------------+
5 rows in set (0.00 sec)
可以看到,在本例插入语句中,没有指定info字段的值,查询结果显示,info字段在定义时默认为NULL,因此系统自动为该字段插入空值。
注意:要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,将无法插入,并且会产生错误。
1.3 同时插入多条记录
INSERT语句插入时指定多个值列表,每个值列表之间用逗号隔开:
mysql> INSERT INTO person(name,age,info)
-> VALUES ('Evans',27,'secretary'),
-> ('Dale',22,'cook'),
-> ('Edison',28,'singer');
Query OK, 3 rows affected (0.36 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 |
+----+--------+-----+------------+
8 rows in set (0.00 sec)
使用INSERT语句同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些包含的字符串的意思分别如下:\
- Records:表明插入的记录条数。
- Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
- Warnings:表明有问题的数据值,例如发生数据类型转换。
1.4 将查询结果插入表中
INSERT INTO table_name (column_list1)
SELECT (column_list2) FROM table_name2 WHERE (condition)
table_name1指定待插入数据的表:column_list1指定待插入表中要插入数据的列;table_name2指定插入数据的来源表;column_list2指定数据来源表的查询列,该列表必须和column_1列表中的字段个数及数据类型相同;condition指定SELECT语句的查询条件。
例:从person_old表中查询所有的记录,并将其插入person表中。
mysql> CREATE TABLE person_old
-> (
-> 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)
-> );
Query OK, 0 rows affected (0.31 sec)
向person_old表中添加两条记录:
mysql> INSERT INTO person_old
-> VALUES (11,'Harry',20,'student'), (12,'Beckham',31,'police');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM person_old;
+----+---------+-----+---------+
| id | name | age | info |
+----+---------+-----+---------+
| 11 | Harry | 20 | student |
| 12 | Beckham | 31 | police |
+----+---------+-----+---------+
2 rows in set (0.00 sec)
可以看到插入记录成功,接下来将person_old表中所有记录插入到person表中,SQL语句如下:
mysql> INSERT INTO person(id,name,age,info)
-> SELECT id,name,age,info FROM person_old;
Query OK, 2 rows affected (0.16 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 |
| 11 | Harry | 20 | student |
| 12 | Beckham | 31 | police |
+----+---------+-----+------------+
10 rows in set (0.00 sec)