当前位置:网站首页>数据修改插入
数据修改插入
2022-07-24 13:37:00 【华为云】
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: 0SQL语句执行成功,查看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: 0SQL语句执行成功,再次查看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: 0SQL结果显示执行成功。再次查看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数据表中。
边栏推荐
- JQ remove an element style
- Collection collection framework
- Modification of EAS login interface
- 论文笔记:Swin-Unet: Unet-like Pure Transformer for MedicalImage Segmentation
- Can communication protocol (I)
- WSDM 22 | 基于双曲几何的图推荐
- Browser failed to get cookies, browser solution
- Thread multithreading
- Bayesian width learning system based on graph regularization
- Get (min / max value) of (object array / array)
猜你喜欢

开放环境下的群智决策:概念、挑战及引领性技术

Group intelligence decision-making in an open environment: concepts, challenges and leading technologies

基于群体熵的机器人群体智能汇聚度量

浅谈Node Embedding

Exploration of sustainable learning ability to support the application of ecological evolution of Pengcheng series open source large models

简易订单管理系统小练习

网络安全——Web信息收集
![[paper reading] temporary binding for semi-superior learning](/img/59/846d868cccad238267bd984f085218.png)
[paper reading] temporary binding for semi-superior learning

汉字风格迁移篇---无监督排版传输

Activity start (launchactivity/startactivity)_ (1)_ WMS of flow chart
随机推荐
群体知识图谱:分布式知识迁移与联邦式图谱推理
Vscode configuration user code snippet (including deletion method)
Implementation of dynamic columns in EAS BOS doc list
Go redis pipeline application
深入浅出边缘云 | 2. 架构
Handler learning
How to verify the domain name after applying for SSL digital certificate?
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二.五)v2
flow
Network security -- man in the middle attack penetration test
Repair the problem of adding device groups and editing exceptions on easycvr platform
申请了SSL数字证书如何进行域名验证?
代码签名证书与SSL证书区别
浅谈Node Embedding
Get (min / max value) of (object array / array)
开放环境下的群智决策:概念、挑战及引领性技术
为什么函数式接口 Comparator 中有 “两个抽象方法”?
Atcoder beginer contest 261 f / / tree array
Introduction to single chip microcomputer
网络安全——使用Exchange SSRF 漏洞结合NTLM中继进行渗透测试