如何在SQL中实现表的增删

 更新时间:2025年10月28日 10:05:06   作者:啊吧怪不啊吧  
本文介绍SQL增删操作,增含建表、全列 / 指定列插入及冲突处理,删有 DELETE 和 TRUNCATE,二者各有逻辑、适用场景,且均保留表结构,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

今天我们来聊一下表的增删。对于数据表来说,数据是非常重要的,所以关于数据的增删也是非常重要的。

1.增

1.1 create

下面这张图就是create的使用方式。

1.2 全列插入

下面这张图就是全列插入,意思就是说给这张表里面的每一个数据都插入值。

1.3 指定列插入

下面这张图就是指定列插入,我们在这里给a1和a2插入了值。那么我们在查看的时候就会发现在这张表的第二行的a3位置就是NULL。

1.4插入否则更新(duplicate)

具体语法:

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

我们在插入值的时候如果给主键或唯一键插入了一样的值那么就会报错。就像下面这样。

这个时候我们就可以使用这个指令在发生冲突的时候来进行更新,通过额外添加的 on duplicate key update a2=15,a3=150;我们就可以实现修改其已被主键占用的那一行值。

1.5替换(replace)

主键 或者 唯一键 没有冲突,则直接插入;

主键 或者 唯一键 如果冲突,则删除后再插入

当主键或者唯一键没用冲突的时候它就会直接插入数据。

我们看下面这张图,我们使用replace那么就可以直接更改主键的那一行值。

我们也可以根据指令执行完后的那一行语句来确定是直接插入还是删除后插入。

-- 1 row affected: 表中没有冲突数据,数据被插入

-- 2 row affected: 表中有冲突数据,删除后重新插入

1.7 deplicate和replace的区别

1.7.1核心操作逻辑不同

  • REPLACE:当插入的数据与表中现有数据发生唯一键冲突时,会先删除表中已存在的冲突行,然后插入新行。本质上等价于执行了 DELETE + INSERT 两个操作。
  • ON DUPLICATE KEY UPDATE:当插入的数据发生唯一键冲突时,不会删除原有行,而是直接更新原有行中指定的字段。本质上等价于执行了 UPDATE 操作(仅针对冲突行)。

1.7.2对自增主键的影响不同

  • REPLACE:由于会先删除冲突行再插入新行,若表使用自增主键,新插入的行会生成新的自增 ID(原有 ID 被废弃,不会重复使用)。例如:原有行 id=1 冲突,REPLACE 后新行可能是 id=2(自增 ID 递增)。
  • ON DUPLICATE KEY UPDATE:仅更新原有行,不会删除数据,因此自增主键的值保持不变。例如:原有行 id=1 冲突,更新后仍为 id=1

1.7.3对未指定字段的处理不同

  • REPLACE:插入新行时,若新数据中未明确指定某些字段,这些字段会使用表定义的默认值(或 NULL),覆盖原有行的值。例如:原有行有 age=20,但 REPLACE 语句未指定 age,则新行的 age 会变为默认值(如 NULL)。
  • ON DUPLICATE KEY UPDATE:仅更新 UPDATE 子句中明确指定的字段,未指定的字段保持原有值不变。例如:原有行 age=20UPDATE 仅指定更新 name,则 age 仍为 20。

1.7.4示例对比

假设有表 student 结构如下:

CREATE TABLE student (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) UNIQUE, -- 唯一索引,可能冲突
  score INT
);

已有数据:(id=1, name='Tom', score=80)

场景:插入 name='Tom' 的新数据(冲突)

使用 REPLACE

REPLACE INTO student (name, score) VALUES ('Tom', 90);

执行后结果:

原有行 (1, 'Tom', 80) 被删除。

插入新行 (2, 'Tom', 90)(id 变为 2,自增 ID 递增)。

使用 ON DUPLICATE KEY UPDATE

INSERT INTO student (name, score) VALUES ('Tom', 90)
ON DUPLICATE KEY UPDATE score = VALUES(score);

执行后结果:

原有行 (1, 'Tom', 80) 被更新为 (1, 'Tom', 90)(id 保持 1,仅更新 score)。

1.7.5适用场景

  • REPLACE:适合需要完全替换冲突行(包括未指定字段使用默认值)的场景,但需注意自增 ID 变化的影响(可能导致 ID 不连续)。
  • ON DUPLICATE KEY UPDATE:适合仅更新部分字段、保留其他原有数据的场景,效率更高(无需删除操作),且不会改变自增 ID。

总结

两者的核心区别在于:REPLACE 是 “删旧插新”,会改变行的存在性和自增 ID;ON DUPLICATE KEY UPDATE 是 “原地更新”,仅修改指定字段,保留原有行的其他属性。选择时需根据是否需要保留原有数据、自增 ID 是否需不变等需求决定。

2. 删

2.1 删除表(delete)

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

我们来看下面这行代码,我们可以通过delete这个指令来删除表中的一行。

如果我们把WHERE name = '孙悟空';这句话去掉的话,那么delete就会直接删除掉整张表。

-- 查看原数据 SELECT * FROM exam_result WHERE name = '孙悟空';
 +----+-----------+-------+--------+--------+ 
| id | name | chinese | math | english |
 +----+-----------+-------+--------+--------+ 
| 2 | 孙悟空 | 174 | 80 | 77 | +
----+-----------+-------+--------+--------+ 
1 row in set (0.00 sec) 
-- 删除数据 
DELETE FROM exam_result WHERE name = '孙悟空';
Query OK, 1 row affected (0.17 sec) 
-- 查看删除结果 
SELECT * FROM exam_result WHERE name = '孙悟空'; 
Empty set (0.00 sec)

PS:delete是不会让那个auto_increment重新开始计算的,也就是说我们删除一张表之后如果再往里面插入数据的话,

2.2 截断表(truncate)

语法:

TRUNCATE [TABLE] table_name

注意:这个操作慎用

1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;

2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚

3. 会重置 AUTO_INCREMENT

所以说这个的话就仅做了解即可,因为他不支持数据回滚就意味着无法通过一些常规手段来对数据表进行复原。但是他删除数据的速度很快,在一些已经确定要删除且数据很大的表中很好用。

2.3 删除的注意点

DELETE 和 TRUNCATE 都只删除表中的数据,而表的结构(包括列定义、数据类型、索引、约束、主键等)会被完整保留,不会被删除。

具体来说:

  • delete:仅删除表中符合条件的行(或全表行),表的结构、索引、约束等元数据完全不变。
  • truncate:同样只删除数据,表的结构、索引、约束等依然保留(相当于 “清空内容但保留容器”)。

到此这篇关于SQL中表的增删的文章就介绍到这了,更多相关sql表增删内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL Server误区30日谈 第15天 CheckPoint只会将已提交的事务写入磁盘

    SQL Server误区30日谈 第15天 CheckPoint只会将已提交的事务写入磁盘

    这个误区是由于太多人对日志和恢复系统缺少全面的了解而存在已久。CheckPoint会将自上次CheckPoint以来所有在内存中改变的页写回磁盘(译者注:也就是脏页),或是在上一个CheckPoint读入内存的脏页写入磁盘
    2013-01-01
  • 使用SSIS创建同步数据库数据任务的方法

    使用SSIS创建同步数据库数据任务的方法

    SSIS(SQL Server Integration Services)是用于生成企业级数据集成和数据转换解决方案的平台。使用 Integration Services 可解决复杂的业务问题,具体表现为:复制或下载文件,发送电子邮件以响应事件,更新数据仓库,清除和挖掘数据以及管理 SQL Server 对象和数据
    2012-09-09
  • SQL Server使用xp_readerrorlog命令查看错误日志

    SQL Server使用xp_readerrorlog命令查看错误日志

    本文探讨了SQL Server中查看日志的四种方法,重点介绍了xp_readerrorlog命令的使用方法,xp_readerrorlog命令用于T-SQL读取SQL Server错误日志,有助于对SQL Server中的问题进行故障排除,避免因特定情况而从GUI读取大型错误日志的麻烦
    2025-03-03
  • sqlserver 自动备份所有数据库的SQL

    sqlserver 自动备份所有数据库的SQL

    可自动备份除系统数据库外的所有数据库。备份文件的周期保存周期可以更改。
    2010-03-03
  • SQL学习笔记四 聚合函数、排序方法

    SQL学习笔记四 聚合函数、排序方法

    SQL学习笔记四 聚合函数、排序方法,在数据调用中非常实用。
    2011-08-08
  • Linux环境安装SQL Server数据库以及使用方法详解

    Linux环境安装SQL Server数据库以及使用方法详解

    很多朋友在安装SQL Server的过程中会碰到一些小状况,下面这篇文章主要给大家介绍了关于Linux环境安装SQL Server数据库以及使用方法的相关资料,需要的朋友可以参考下
    2024-02-02
  • SQL Server数据库的高性能优化经验总结

    SQL Server数据库的高性能优化经验总结

    小编以前在做ASP及.NET的时候经常用到SQL SERVER,现在用PHP虽然大多数时候用MYSQL,但不泛有些客户要在原来SQL的平台上升级或兼容开发,值得庆幸的是PHP无所不能,基本上所有的数据库它都能连接并支持
    2011-07-07
  • SQL Server中with as使用介绍

    SQL Server中with as使用介绍

    这篇文章主要介绍了SQL Server中with as使用介绍,需要的朋友可以参考下
    2019-11-11
  • 基于Microsoft SQL Server实现编写汉字转拼音函数

    基于Microsoft SQL Server实现编写汉字转拼音函数

    在搜索应用中,我们一般会提供一个搜索框,输入关健字,点击查询按钮以获取结果数据,大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果,本文给大家就介绍了基于Microsoft SQL Server实现编写汉字转拼音函数,需要的朋友可以参考下
    2024-03-03
  • 万能密码的SQL注入漏洞其PHP环境搭建及防御手段

    万能密码的SQL注入漏洞其PHP环境搭建及防御手段

    这篇文章主要介绍了万能密码的SQL注入漏洞其PHP环境搭建及防御手段,对此感兴趣的小伙伴赶快收藏起来吧
    2021-09-09

最新评论