数据修改插入

举报
xcc-2022 发表于 2022/07/24 11:14:07 2022/07/24
【摘要】 12.1 数据插入MySQL向数据表中插入数据使用INSERT语句。可以向数据表中插入完整的行记录,为特定的字段插入数据,也可以使用一条INSERT语句向数据表中一次插入多行记录,还可以将一个数据表的查询结果插入另一个数据表中。12.1.1 数据插入规则使用INSERT语句向MySQL数据表中插入数据记录时,可以指定向表中的哪些列或字段插入数据,也可以不指定,规则如下:·当需要向数据表中插入...

12.1 数据插入

MySQL向数据表中插入数据使用INSERT语句。可以向数据表中插入完整的行记录,为特定的字段插入数据,也可以使用一条INSERT语句向数据表中一次插入多行记录,还可以将一个数据表的查询结果插入另一个数据表中。


12.1.1 数据插入规则

使用INSERT语句向MySQL数据表中插入数据记录时,可以指定向表中的哪些列或字段插入数据,也可以不指定,规则如下:

·当需要向数据表中插入完整的行记录,并且没有指定需要插入数据的列或字段时,MySQL默认会向所有列或字段中插入数据,这就要求插入数据的值列表必须对应数据表中所有的列或字段。

·当需要向数据表中插入完整的行记录,并且需要指定插入数据的列或字段时,必须指定所有的列或字段插入数据(整数类型并且标识为AUTO_INCREMENT的自增主键列或字段除外)。

·当未指定插入数据的列或字段时,插入数据的值列表必须对应数据表中的所有列或字段,并且插入值列表的顺序必须和数据表中定义字段的顺序保持一致。

·当指定了插入数据的列或字段时,插入数据的值列表必须对应列或字段列表,不需要按照表定义的列或字段的顺序插入,只需要保证插入的值列表的顺序与列或字段的列表顺序一致即可。

·当指定了插入数据的列或字段时,可以向数据表中插入完整的行记录,也可以只向部分字段中插入数据。


12.1.2 插入完整的行记录

向MySQL的数据表中插入数据时,可以指定需要插入数据的列或字段,也可以不指定。本节就简单地介绍一下如何向MySQL的数据表中插入完整的行记录。

1.语法格式

向MySQL数据表中插入完整的行记录,根据是否指定列或字段有以下两种语法格式:


INSERT INTO table_name 
VALUES 
(value1 [, value2, … , valuen])

或者


INSERT INTO table_name 
(column1 [, column2, …, columnn]) 
VALUES 
(value1 [,value2, …, valuen])

其中:table_name为数据表的名称;column1 [,column2,…,column]为列或字段列表,可以指定列或字段列表,也可以不指定;value1 [,value2,…,valuen]为数据值列表。

2.简单示例

以第8章中创建的名称为t_goods的数据表为例,向数据表中插入数据。首先,查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
Empty set (0.00 sec)

结果显示t_goods数据表中的数据为空。接下来,不指定需要插入数据的字段或列,向t_goods表中插入数据。


mysql> INSERT INTO t_goods VALUES (1, 1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00');
Query OK, 1 row affected (0.00 sec)

SQL语句执行结果显示插入数据成功。

查看数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+---------------------+--------+---------+---------+---------------------+
| id | t_category_id | t_category           | t_name | t_price | t_stock | t_upper_time        |
+----+---------------+---------------------+--------+---------+---------+---------------------+
|  1 |              1 | 女装/女士精品       | T恤    | 39.90    |    1000 | 2020-11-10 00:00:00 |
+----+---------------+---------------------+--------+---------+---------+---------------------+
1 row in set (0.00 sec)

可以看到,t_goods数据表中插入了一行完整的数据记录,说明插入数据成功。

指定需要插入数据的字段或列,向t_goods数据表中插入数据。


mysql> INSERT INTO t_goods (t_category_id, t_category, t_name, t_price, t_stock, t_upper_time)
    -> VALUES
    -> (1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00');
Query OK, 1 row affected (0.00 sec)

此时,指定了向t_goods数据表中的哪些字段插入数据,由于数据表中的id列是整数类型并且是AUTO_INCREMENT自增类型的,所以可以不用指定id列进行数据插入。SQL执行结果显示成功,接下来再次查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+---------------------+-----------+---------+---------+-------------------+
| id | t_category_id | t_category          | t_name    | t_price | t_stock | t_upper_time      |
+----+---------------+---------------------+-----------+---------+---------+-------------------+
|  1 |              1 | 女装/女士精品       | T恤       |   39.90 |   1000  |2020-11-10 00:00:00|
|  2 |              1 | 女装/女士精品       | 连衣裙    |   79.90 |   2500  |2020-11-10 00:00:00|
+----+---------------+---------------------+-----------+---------+---------+-------------------+
2 rows in set (0.00 sec)

可以看到,t_goods数据表中已经存在两条数据,说明数据插入成功。

指定需要插入数据的字段或列时,不需要按照表定义字段的顺序插入,只需要保证值列表的顺序与字段列表的顺序一致即可。


mysql> INSERT INTO t_goods (t_category_id, t_name, t_price, t_upper_time, t_stock, t_category) 
    -> VALUES 
    -> (1, '卫衣', 79.90, '2020-11-10 00:00:00', 1500, '女装/女士精品');
Query OK, 1 row affected (0.00 sec)

SQL语句执行成功,再次查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+---------------------+-----------+---------+---------+-------------------+
| id | t_category_id | t_category          | t_name    | t_price | t_stock | t_upper_time      |
+----+---------------+---------------------+-----------+---------+---------+-------------------+
|  1 |             1 | 女装/女士精品       | T恤       |  39.90  |   1000  |2020-11-10 00:00:00|
|  2 |             1 | 女装/女士精品       | 连衣裙    |  79.90  |   2500  |2020-11-10 00:00:00|
|  3 |             1 | 女装/女士精品       | 卫衣      |  79.90  |   1500  |2020-11-10 00:00:00|
+----+---------------+---------------------+-----------+---------+---------+-------------------+
3 rows in set (0.00 sec)

可以看到,数据插入成功。

注意:如果向数据表中插入数据时未指定需要插入数据的列或字段,则插入的值列表必须和数据的列或字段一一对应,同时顺序也必须相同。此时,如果表结构发生变化,则以这种方式插入数据会出现值列表与字段列表不匹配的错误,所以在实际开发过程中,建议读者在向数据表中插入数据时,指定需要插入数据的列或字段。


12.1.3 指定字段插入数据

MySQL支持向部分字段插入数据,未插入数据的字段会按照创建数据表时定义字段的默认值插入数据。

1.语法格式

语法格式如下:


INSERT INTO table_name 
(column1 [, column2, …, columnn]) 
VALUES 
(value1 [,value2, …, valuen])

其中:table_name为数据表的名称;column1 [,column2,…,column]为列或字段列表,可以指定列或字段列表,也可以不指定;value1 [,value2,…,valuen]为数据值列表。

2.简单示例

向t_goods数据表中插入一条数据,t_category_id字段为1,t_category字段的数据为“女装/女士精品”,t_name字段的数据为“牛仔裤”,其他字段不插入数据,使用创建数据表时定义的默认值。


mysql> INSERT INTO t_goods(t_category_id, t_category, t_name)
    -> VALUES
    -> (1, '女装/女士精品', '牛仔裤');
Query OK, 1 row affected (0.65 sec)

SQL语句执行成功,查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+---------------------+-----------+---------+---------+-------------------+
| id | t_category_id | t_category          | t_name    | t_price | t_stock | t_upper_time      |
+----+---------------+---------------------+-----------+---------+---------+-------------------+
|  1 |             1 | 女装/女士精品       | T恤       |   39.90 |    1000 |2020-11-10 00:00:00|
|  2 |             1 | 女装/女士精品       | 连衣裙    |   79.90 |    2500 |2020-11-10 00:00:00|
|  3 |             1 | 女装/女士精品       | 卫衣      |   79.90 |    1500 |2020-11-10 00:00:00|
|  4 |             1 | 女装/女士精品       | 牛仔裤    |    0.00 |       0 |NULL               |
+----+---------------+---------------------+-----------+---------+---------+-------------------+
4 rows in set (0.00 sec)

可以看到,id为4的记录中,t_category_id字段、t_category字段、t_name字段中插入了指定的数据,而t_price字段、t_stock字段和t_upper_time字段未指定插入的数据,插入了定义数据表时指定的默认值,即t_price字段插入了默认值0.00,t_stock字段插入了默认值0,t_upper_time字段插入了默认值NULL。


12.1.4 一次插入多条数据记录

MySQL支持使用INSERT语句向数据表中一次插入多条数据记录,只需要在插入数据时指定多个值列表,每个值列表之间以逗号分隔即可。

1.语法格式

一次插入多条记录时,可以指定需要插入数据的字段,也可以不指定。语法格式如下:


INSERT INTO table_name 
VALUES 
(value1 [,value2, …, valuen]),
(value1 [,value2, …, valuen]),
……
(value1 [,value2, …, valuen])

或者


INSERT INTO table_name 
(column1 [, column2, …, columnn]) 
VALUES 
(value1 [,value2, …, valuen]),
(value1 [,value2, …, valuen]),
……
(value1 [,value2, …, valuen])

从语法格式上看,使用INSERT语句一次插入多条数据记录时,一个字段列表对应多个值列表即可。

2.简单示例

不指定插入数据的字段,向t_goods数据表中一次插入多条数据记录。


mysql> INSERT INTO t_goods
    -> VALUES
    -> (5, 1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
    -> (6, 1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

可以看到,SQL语句执行成功,查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+-----------------+------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name     | t_price | t_stock |    t_upper_time     |
+----+---------------+-----------------+-----------1+---------+---------+---------------------+
|  1 |             1 | 女装/女士精品   | T恤        |   39.90 |   1000  | 2020-11-10 00:00:00 |
|  2 |             1 | 女装/女士精品   | 连衣裙     |   79.90 |  2500   | 2020-11-10 00:00:00 |
|  3 |             1 | 女装/女士精品   | 卫衣       |   79.90 |  1500   | 2020-11-10 00:00:00 |
|  4 |             1 | 女装/女士精品   | 牛仔裤     |    0.00 |     0   | NULL                |
|  5 |             1 | 女装/女士精品   | 百褶裙     |   29.90 |   500   | 2020-11-10 00:00:00 |
|  6 |             1 | 女装/女士精品   | 呢绒外套   |  399.90 |  1200   | 2020-11-10 00:00:00 |
+----+---------------+-----------------+------------+---------+---------+---------------------+
6 rows in set (0.00 sec)

可以看到,t_goods数据表中多了两条id为5和6的数据,说明数据插入成功。

注意:向MySQL数据表中插入多条数据记录且不指定插入数据的字段时,插入数据的值列表同样需要与数据表中的字段类型和字段顺序保持一致,并且值列表需要对应数据表中的所有字段。

指定插入数据的字段,向t_goods数据表中一次插入多条数据记录。


mysql> INSERT INTO t_goods 
    -> (t_category_id, t_category, t_name, t_price, t_stock, t_upper_time)
    -> VALUES
    -> (2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'),
    -> (2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'),
    -> (2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
    -> (2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'),
    -> (2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'),
    -> (2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

SQL语句执行成功,查看t_goods数据表中的数据。


mysql> SELECT * FROM t_goods;
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category      | t_name      | t_price | t_stock |    t_upper_time     |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
|  1 |             1 | 女装/女士精品   | T恤         |   39.90 |   1000  | 2020-11-10 00:00:00 |
|  2 |             1 | 女装/女士精品   | 连衣裙      |   79.90 |   2500  | 2020-11-10 00:00:00 |
|  3 |             1 | 女装/女士精品   | 卫衣        |   79.90 |   1500  | 2020-11-10 00:00:00 |
|  4 |             1 | 女装/女士精品   | 牛仔裤      |    0.00 |      0  | NULL                |
|  5 |             1 | 女装/女士精品   | 百褶裙      |   29.90 |    500  | 2020-11-10 00:00:00 |
|  6 |             1 | 女装/女士精品   | 呢绒外套    |  399.90 |   1200  | 2020-11-10 00:00:00 |
|  7 |             2 | 户外运动        | 自行车      |  399.90 |   1000  | 2020-11-10 00:00:00 |
|  8 |             2 | 户外运动        | 山地自行车  | 1399.90 |   2500  | 2020-11-10 00:00:00 |
|  9 |             2 | 户外运动        | 登山杖      |   59.90 |   1500  | 2020-11-10 00:00:00 |
| 10 |             2 | 户外运动        | 骑行装备    |  399.90 |   3500  | 2020-11-10 00:00:00 |
| 11 |             2 | 户外运动        | 运动外套    |  799.90 |    500  | 2020-11-10 00:00:00 |
| 12 |             2 | 户外运动        | 滑板        |  499.90 |   1200  | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
12 rows in set (0.00 sec)

从查询结果中可以看到,数据插入成功。


12.1.5 将查询结果插入另一个表中

INSERT语句不仅支持向数据表中直接插入数据,还可以支持向数据表中插入SELECT语句的查询结果。

1.语法格式

语法格式如下:


INSERT INTO target_table
(tar_column1 [, tar_column2, …, tar_columnn])
SELECT
(src_column1 [, src_column2, …, src_columnn])
FROM source_table
[WHERE condition]

语法格式说明如下:

·target_table:需要插入数据的目标表。

·tar_column1 [,tar_column2,…,tar_columnn]:需要插入数据的目标表中的字段列表。

·source_table:使用SELECT语句查询数据的来源表。

·src_column1 [,src_column2,…,src_columnn]:数据来源表中的字段列表。

·condition:使用SELECT语句查询数据的条件限制。

2.简单示例

首先,创建名称为t_goods_target的数据表,作为插入数据的目标表。t_goods_target数据表中包含的数据字段有id、t_category、t_name和t_price,在MySQL命令行执行创建t_goods_target数据表的SQL语句。


mysql> CREATE TABLE t_goods_target (
    -> id int NOT NULL AUTO_INCREMENT COMMENT '商品记录id',    
    -> t_category varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '
商品类别名称',
    -> t_name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '商品
名称',
    -> t_price decimal(10,2) DEFAULT '0.00' COMMENT '商品价格',
    -> PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.41 sec)

创建数据表成功。查询t_goods_target数据表中的数据。


mysql> SELECT * FROM t_goods_target;
Empty set (0.00 sec)

可以看到,新创建的t_goods_target数据表中的数据为空。

接下来,将从t_goods数据表中查询出来的数据插入t_goods_target数据表中。


mysql> INSERT INTO t_goods_target
    -> (t_category, t_name, t_price)
    -> SELECT
    -> t_category, t_name, t_price
    -> FROM t_goods
    -> WHERE id = 1;
Query OK, 1 row affected (0.11 sec)
Records: 1  Duplicates: 0  Warnings: 0

SQL语句执行成功,再次查看t_goods_target数据表中的数据。


mysql> SELECT * FROM t_goods_target;
+----+---------------------+--------+---------+
| id | t_category          | t_name | t_price |
+----+---------------------+--------+---------+
|  1 | 女装/女士精品       | T恤    |  39.90  |
+----+---------------------+--------+---------+
1 row in set (0.00 sec)

结果显示数据已经成功插入t_goods_target数据表中。

当要插入数据的目标表与查询数据的源数据表结构完全相同时,可以不指定插入数据的目标表的字段列表。

使用CREATE…LIKE…语句创建名称为t_goods_backup的数据表,t_goods_backup数据表的结构与t_goods数据表的结构完全相同。


mysql> CREATE TABLE t_goods_backup LIKE t_goods;
Query OK, 0 rows affected (0.02 sec)

数据表创建成功。查询t_goods_backup数据表中的数据。


mysql> SELECT * FROM t_goods_backup;
Empty set (0.00 sec)

可以看到,新创建的t_goods_backup数据表中的数据为空。

查询t_goods数据表中的数据并将数据插入t_goods_backup数据表中。


mysql> INSERT INTO t_goods_backup
    -> SELECT * FROM t_goods;
Query OK, 12 rows affected (0.00 sec)
Records: 12  Duplicates: 0  Warnings: 0

SQL结果显示执行成功。再次查看t_goods_backup数据表中的数据。


mysql> SELECT * FROM t_goods_backup;                
+----+---------------+----------------+------------+---------+---------+---------------------+
| id | t_category_id | t_category     | t_name      | t_price | t_stock |    t_upper_time     |
+----+---------------+----------------+------------+---------+---------+---------------------+
|  1 |              1 | 女装/女士精品  | T恤        |   39.90 |   1000  | 2020-11-10 00:00:00 |
|  2 |              1 | 女装/女士精品  | 连衣裙      |   79.90 |   2500  | 2020-11-10 00:00:00 |
|  3 |              1 | 女装/女士精品  | 卫衣        |   79.90 |   1500  | 2020-11-10 00:00:00 |
|  4 |              1 | 女装/女士精品  | 牛仔裤      |    0.00 |      0  | NULL                 |
|  5 |              1 | 女装/女士精品  | 百褶裙      |   29.90 |    500  | 2020-11-10 00:00:00 |
|  6 |              1 | 女装/女士精品  | 呢绒外套    |  399.90 |   1200  | 2020-11-10 00:00:00 |
|  7 |              2 | 户外运动        | 自行车      |  399.90 |   1000  | 2020-11-10 00:00:00 |
|  8 |              2 | 户外运动        | 山地自行车  | 1399.90 |   2500  | 2020-11-10 00:00:00 |
|  9 |              2 | 户外运动        | 登山杖      |   59.90 |   1500  | 2020-11-10 00:00:00 |
| 10 |              2 | 户外运动        | 骑行装备    |  399.90 |   3500  | 2020-11-10 00:00:00 |
| 11 |              2 | 户外运动        | 运动外套    |  799.90 |    500  | 2020-11-10 00:00:00 |
| 12 |              2 | 户外运动        | 滑板        |  499.90 |   1200  | 2020-11-10 00:00:00 |
+----+---------------+----------------+------------+---------+---------+---------------------+
12 rows in set (0.00 sec)

结果显示已经将t_goods数据表中的数据成功插入了t_goods_backup数据表中。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。