MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > sql增删

如何在SQL中实现表的增删

作者:啊吧怪不啊吧

本文介绍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核心操作逻辑不同

1.7.2对自增主键的影响不同

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

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;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 都只删除表中的数据,而表的结构(包括列定义、数据类型、索引、约束、主键等)会被完整保留,不会被删除。

具体来说:

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

您可能感兴趣的文章:
阅读全文