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)
原文地址:https://www.cnblogs.com/xiaotufei/p/13338443.html