truncate 和 delete对自增ID的影响

SQL表操作与Identity重置
本文演示了如何使用SQL语句创建表、插入数据、截断表、删除记录及重置标识种子等常见操作。通过具体实例展示了不同操作对表的影响。
if(object_id('dbo.testa') is not null) drop table testa;
go
create table testa(id bigint not null primary key identity(1,1) ,tname nvarchar(max) );
--3 Times
insert into testa(tname) values(N'ddcawsdqwedf'),(N'ddcawsdqwedf'),(N'ddcawsdqwedf');

select max(id) from testa; --9

truncate table testa;

insert into testa(tname) values(N'ddcawsdqwedf'),(N'ddcawsdqwedf'),(N'ddcawsdqwedf');

select max(id) from testa; --3

delete from testa where id<=3;

insert into testa(tname) values(N'ddcawsdqwedf'),(N'ddcawsdqwedf'),(N'ddcawsdqwedf');

select max(id) from testa; --6

--重置identity seed(新加入的值=seed+step)
DBCC CHECKIDENT ('testa', RESEED, 0)

drop table testa;

truncate delete 都可以删除表中的数据,但存在多方面的区别: - **SQL 语言范畴**:delete 属于 DML(数据操作语言)范畴;truncate 属于 DDL(数据定义语言)范畴。这使得在事务中的表现不同,delete 在事务中可以进行回滚提交操作(由操作者决定),而 truncate 执行后会自动提交,不可回滚[^1][^2][^4]。 - **操作对象与删除方式**:delete 的操作对象是表中的每行数据,属于行级别,可以通过添加 where 条件删除部分数据,是逐行删除;truncate 的操作对象是表,不能加 where 条件,一执行就是整体删除表中所有数据[^2]。 - **日志记录**:delete 会记录每一行的删除操作;truncate 只记录数据页被清空[^3]。 - **触发器触发情况**:delete 操作会触发触发器;truncate 不会触发触发器[^1][^3]。 - **删除速度**:delete 较慢,尤其在删除大量数据时;truncate 快速,适合删除大量数据,因为它是直接释放存储表数据所用的数据页来删除数据,而 delete 走事务,有 binlog 记录[^2][^3]。 - **回滚情况**:delete 可以回滚(如果未提交);truncate 通常不可回滚[^3]。 - **对表结构计数器的影响**:两者都不影响表结构,但 truncate 会重置自计数器,而 delete影响计数器,若表 id 是递式的,delete 后表数据的 id 可能不连续[^1][^2][^3]。 - **锁定粒度**:delete 是行级锁;truncate 通常会在整个表级加锁,确保在清空表时没有其他操作干扰[^3]。 - **外键约束**:delete 可以通过 SQL 语句,根据外键有序地删除本表相关表中的数据;存在外键约束时,truncate 删除失败[^1][^2]。 - **使用场景**:delete 适用于删除表中的部分数据,或者需要在删除数据时触发触发器的场景;truncate 适用于需要快速清空表中所有数据的场景,且不需要精确控制哪些数据被删除的情况(例如在清空一个临时表时)[^3]。 示例代码: ```sql -- delete 删除表中所有数据 DELETE FROM table_name; -- delete 删除表中部分符合条件的数据 DELETE FROM table_name WHERE condition; -- truncate 删除表中所有数据 TRUNCATE TABLE table_name; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值