【MySQL入门指南】4种插入数据的方法

news2024/11/23 12:50:11

文章目录

  • MySQL的增删查改① - 增
    • 1.发生冲突则失败
      • 1.1 基本语法
      • 1.2 单行数据+全列插入
      • 1.3 多行数据 + 指定列插入
    • 2.发生冲突则更新
      • 2.1 基本语法
      • 2.2 插入否则更新
    • 3.发生冲突则替换
      • 3.1 基本语法
      • 3.2插入否则替换
    • 4.插入查询结果

MySQL的增删查改① - 增

-- 创建一张学生表
CREATE TABLE students (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    sn INT NOT NULL UNIQUE COMMENT '学号',
    name VARCHAR(20) NOT NULL,
    qq VARCHAR(20)
);

增加记录的实验都将在students表上进行,students表的结构如上图所示。

1.发生冲突则失败

1.1 基本语法

🎯[语法]:

INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...

📝[说明]:

  • []中的内容是可以省略的,如下:

    insert students values (0, 10000, '唐三藏', NULL);  
    
  • 在插入数据的时候,values中的值是与column前后一一对应的。如果column省略,则表示全列插入——给所有列依次插入

    image-20230502143041498

  • insert语句一次可以插入多条记录,记录间用逗号隔开

    INSERT INTO students (id, sn, name) VALUES
    	(102, 20001, '曹孟德'),
    	(103, 20002, '孙仲谋');
    
  • 当主键或者唯一键的唯一性发生冲突时(即插入重复的记录时),插入操作失败

下面为大家一些具体的使用案例:

1.2 单行数据+全列插入

mysql> insert into students values(1, 10000, '唐三藏', '123456');
Query OK, 1 row affected (0.01 sec)

mysql> insert into students values(2, 10001, '孙悟空', '1234567');
Query OK, 1 row affected (0.00 sec)

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 | 10000 | 唐三藏    | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
+----+-------+-----------+---------+
2 rows in set (0.00 sec)

1.3 多行数据 + 指定列插入

mysql> insert into students(sn, name) values(10002, '曹孟德'),(10003, '孙仲谋');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 | 10000 | 唐三藏    | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)

📌[注意]:

  • insert语句可以一次插入多条记录,各条记录间用逗号分隔。
  • 更加推荐使用指定列插入,这样就算表的结构改变了(比如增加了一个邮箱字段),我们的sql语句也不会受影响

2.发生冲突则更新

2.1 基本语法

🎯[语法]:

INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] 

📝[说明]:

  • 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作,即对指定列的值进行修改

2.2 插入否则更新

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 | 10000 | 唐三藏    | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)

-- 主键发生冲突,进行更新操作

mysql> insert into students(id, sn, name) values(1, 10000, '唐僧')
    -> on duplicate key update sn=9999, name='唐僧';
Query OK, 2 rows affected (0.00 sec)

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 |  9999 | 唐僧      | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
+----+-------+-----------+---------+
4 rows in set (0.00 sec)

-- 没有发生冲突,正常插入

mysql> insert into students(id, sn, name) values(5, 10000, '唐僧') 
	-> on duplicate key update id = 6, sn=9999, name='唐长老';
Query OK, 1 row affected (0.01 sec)

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 |  9999 | 唐僧      | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
|  5 | 10000 | 唐僧      | NULL    |
+----+-------+-----------+---------+
5 rows in set (0.00 sec)

📌[注意]:

  • 当插入数据(1, 10000, '唐僧')时,主键id发生冲突,因此对原记录进行选择性修改
  • 当插入数据(5, 10000, '唐僧')时,没有发生冲突,则正常插入

3.发生冲突则替换

3.1 基本语法

🎯[语法]:

REPLACE INTO students [(column [, column] ...)] VALUES (value_list) [, (value_list)] ...

📝[说明]:

  • 主键、唯一键没有发生冲突,则直接插入数据

  • 发生冲突,则删除原始数据后再插入(即替换的效果)

3.2插入否则替换

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 |  9999 | 唐僧      | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
|  5 | 10000 | 唐僧      | NULL    |
+----+-------+-----------+---------+
5 rows in set (0.00 sec)

-- 主键发生冲突则进行替换

mysql> replace into students(id, sn, name, qq) values(5, 10004, '刘玄德', '666666');
Query OK, 2 rows affected (0.01 sec)

-- 没有发生主键冲突则直接插入

mysql> replace into students(id, sn, name, qq) values(6, 10005, '关云长', '888888');
Query OK, 1 row affected (0.00 sec)

mysql> select * from students;
+----+-------+-----------+---------+
| id | sn    | name      | qq      |
+----+-------+-----------+---------+
|  1 |  9999 | 唐僧      | 123456  |
|  2 | 10001 | 孙悟空    | 1234567 |
|  3 | 10002 | 曹孟德    | NULL    |
|  4 | 10003 | 孙仲谋    | NULL    |
|  5 | 10004 | 刘玄德    | 666666  |
|  6 | 10005 | 关云长    | 888888  |
+----+-------+-----------+---------+
6 rows in set (0.00 sec)

📌[注意]:

  • 插入数据 5, 10004, '刘玄德', '666666' 时,主键发生冲突,因此先删除表中原先冲突的数据,再将数据插入。所以我们会看到 “2 rows affected”
  • 插入数据 6, 10005, '关云长', '888888' 时没有发生冲突,则直接插入。我们也不难理解为什么是“1 row affected”
  • 如果插入的数据与多行数据都有冲突,那么所有冲突的记录都会被删除

4.插入查询结果

INSERT 还支持将查询结果插入到一张表中:

  • 快速创建一张和现有表结构相同的表

    create table t1 like t2  -- 只会靠别表结构,不会拷贝数据
    
  • 将一张表中的搜索结果插入到另一张表中

    -- 将表for_duplicate去重后的数据插入到 duplicate 中
    mysql> insert into for_duplicate values(1, 'aa'), (1, 'aa'), (2, 'bb'), (2, 'bb');
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> insert into duplicate select distinct * from for_duplicate;
    Query OK, 2 rows affected (0.00 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from duplicate;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | aa   |
    |    2 | bb   |
    +------+------+
    2 rows in set (0.00 sec)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

狂神 springcloud学习

springcloud学习 笔记整理来源 B站UP主狂神说https://www.bilibili.com/video/BV1jJ411S7xr 参考:菜鸟小杰子 https://blog.csdn.net/lijie0213/article/details/107914619 参考:路飞 https://csp1999.blog.csdn.net/article/details/106255122?spm100…

stm32cubemx配置mpu6050——10分钟0基础到灵活使用

stm32cubemx配置mpu6050——10分钟0基础到灵活使用 10分钟速通!你没看错,就是10min,从0基础到灵活运用mpu6050。 不信?往下看看就会:嗷~原来如此 第一步 下载github开源代码。 https://github.com/leech001/MPU6050首…

从零开始学习Linux运维,成为IT领域翘楚(六)

文章目录 🔥Linux磁盘管理🔥Linux挂载硬盘🔥Linux系统状态检测命令🔥Linux下载软件安装的命令 🔥Linux磁盘管理 分区的方式 🐟 MBR分区表:每块硬盘最大支持2.1TB硬盘,每块硬盘最多支…

《编程思维与实践》1042.字串变换

《编程思维与实践》1042.字串变换 题目 思路 分两步解决: 1.判断是否可以通过两种变换使所有的字符串变得相同; 2.在能变换的前提下使变换的次数最少。 其中第一步可以将每个字符串的基底(将连续重复出现的字符视为一个字符)求出来, 如: aaabbb的基底就…

28《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第七章:Proteins Evolve (蛋白进化) 蛋白质分子可以通过生物进化而发生改变。随着生物体的进化,它们…

Haproxy集群

引言 Haproxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。 一、Haproxy简介 1、Haproxy应用分析 LVS在企业中康复在能力很强,但存在不足: LVS不支持正则处理&…

Java编程中的20种常见异常及其原因,你知道多少

本文介绍了在Java编程中可能遇到的20种常见异常,包括空指针异常、类未找到异常、数组下标越界异常等,并简要解释了每种异常发生的原因。这些异常可能由于编程错误、运行时资源不足或权限受限等多种原因触发,了解它们有助于更高效地进行程序调…

Crowdsoure的简单介绍

一、什么是Crowdsoure 在美国《连线》杂志2006年的6月刊上,记者Jeff Howe首次提出了Crowdsoure(众包)的概念。众包是一个框架,它将大量分散的人群聚集在一起,收集数据,解决问题,或应对挑战。它…

55、RK3588使用MPP编码yuv到h264、解码h264到yuv模块开发和测试

基本思想:需要使用独立模块代码去实现自己的逻辑功能,所以在基于官方源码基础上,和参考附录几个官方链接,搞出一版rk3588编码测试和解码测试demo 测试视频/生成h264/生成yuv 链接: https://pan.baidu.com/s/1HbpeqMJb8HcgFpzaKh…

JavaScript:字符串

文章目录 字符串344. 反转字符串reverse() 方法(打基础的时候,不要太迷恋库函数)代码及思路 541. 反转字符串 IIJavaScript String split() 方法JavaScript Array join() 方法代码分析见注释 剑指 Offer 05. 替换空格思路注意:上面…

计算机模式识别有哪些SCI期刊推荐? - 易智编译EaseEditing

计算机模式识别是指利用计算机技术,识别、分析和理解图像、声音、文本等各种模式的能力。以下是一些推荐的SCI期刊: IEEE Transactions on Pattern Analysis and Machine Intelligence IEEE Transactions on Pattern Analysis and Machine Intelligence …

OpenGL学习日志之模板测试

模板测试(Stencil Test)出现原因 深度测试更多是为了解决如何区分物体前后遮挡关系,从而选择丢弃片段的测试。而模板测试,是通过设置片元模板缓冲区模板值和引用模板值,再按照我们设定的运算函数来丢弃某些片段&#…

HTB-Brainfuck

HTB-Brainfuck 信息收集443端口https://sup3rs3cr3t.brainfuck.htb/https://brainfuck.htb/和www.brainfuck.htb 立足读取root.txt内容oresits -> root 信息收集 443端口 查看对应证书。 从证书中能获得 Email Address: orestisbrainfuck.htbCommon Name&#…

解决echarts 在缩放中模糊的问题

echarts 在缩放中模糊的问题 参考:缩放带来的echarts模糊 1、echarts.init(dom,null,{ renderer : svg }); 2、echarts.init(chart,null, { devicePixelRatio: 2 });问题:在使用dom-to-image插件截图的情况下: 1、使用方式一 { renderer : …

Jetson Nano emmc版本系统镜像备份和烧录

一、镜像备份 1.将待复制的jetson设备进入恢复模式,用数据线连接jetson设备和主机。 对于原厂开发板将FC_REC引脚与GND短接,通过micro-usb到usb数据线连接到电脑。 在电脑的ubuntu通过lsusb命令查看需要备份的设备是否已经接入&#xff0c…

vue3.x + vite4.3构建属于自己的组件库并发布npm包

在国内的项目研发过程中,使用vue框架的项目占比很大,同样延伸出了很多非常优秀的UI组件库,比如element-plus、ant-design等;优势:资源较少,快速开发,丰富的API,阅读性、性能优化更好…

医疗实验室信息管理系统源码(云LIS)

云LIS系统源码是一种医疗实验室信息管理系统,提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明: 技术架构:Asp.NET CORE 3.1 MVC SQLserver Re…

Spring:使用注解进行Spring开发(@Component、@Configuration、@ComponentScan、@Autowired等)

Component、Configuration、ComponentScan、Autowired、Scope、Value、Resource、Bean、Qualifier、PropertySource等注解 1. 注解和配置文件applicationContext.xml配合使用 现在有一个接口类Book3Dao、和其实现类Book3DaoImpl,利用注解和配置文件在测试类上调用其…

【Linux网络】网络应用层的 http 和 https协议

文章目录 1、http协议1.1 认识URL1.2 http协议格式1.3 http的方法(GET和POST)1.4 状态码1.5 cookie1.6 短连接和长连接 2、https协议2.1 常见的加密方式2.2 探究https协议的加密2.3 CA证书 1、http协议 在之前学习序列化和反序列化的时候,认…

Linux 之 vi 文本编辑器(二)

1、文本编辑器简介 Linux 中最常用的文本编辑器: vi:类 Unix 系统中默认的文本编辑器 vim:vi 编辑器的增强版本,习惯上也称 vi vi 文本编辑器的作用和特性: vi 可以执行插入、删除、查找、替换等众多文本操作&…