在sql server中truncate、delete、drop删除表的区别,详细点,越详细越好。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在sql server中truncate、delete、drop删除表的区别,详细点,越详细越好。相关的知识,希望对你有一定的参考价值。

truncate、delete都是删除表中的数据。truncate直接删除全部的数据,delete可以加上where条件删除部分数据。truncate效率高,直接释放多余的资源,执行后数据不可恢复,delete效率低,不释放资源,短时间内可恢复删除的记录。

drop是表数据和表定义一起都删了。追问

短时间是多久?超过多长时间就不可以恢复了?

追答

可恢复时间和数据库设置和数据库性能有关。没有具体的时长

追问

除了以上的这些区别,还有别的区别吗?

参考技术A 简单来说,如果是对于 TableA 来说
1、drop table TableA ,删除表,然后你用 select * from TableA 已经提示查询出错了,表不存在
2、truncate table TableA 清空表中的数据,不能加条件,记住是全清。这个速度会比较快, 而且并不产生任何日志 ,使用 select * from TableA 可以执行,但是表里面一条数据都没有
3、delete from TableA 可以根据需要的条件删除数据,但是,如果一次删除大数据量的数据,比如删除1KW条,可能数据库会卡死╮(╯_╰)╭
参考技术B drop 删除整个表结构和里面的数据

truncate和delete只能删除表中的数据,区别如下:
truncate删除的数据不会产生日志记录
delete删除的数据会产生日志记录追问

delete可以回滚,truncate不可以回滚。
麻烦你再说的详细点。

追答

比如你的表有100万条记录
使用DELETE语句删除这100万条数据。那么就会产生100万条日志记录。
由于某些原因我不想删除这些数据了,在执行时我取消了执行删除这个操作。(将会回滚)
由于使用的是DELETE存在日志记录。在我取消前,删除的数据就可以恢复到以前的状态。
如果使用的是TRUNCATE,在执行中取消,如果删除了50万条记录。那么这部分数据是无法恢复的。(没有日志记录无法回滚)
注意:使用TRUNCATE删除数据相当快。可能等你想取消时,数据全都已经被删除了。

由于截断/删除导致 SQL Server 主键冲突?

【中文标题】由于截断/删除导致 SQL Server 主键冲突?【英文标题】:SQL Server Primary key violation due to truncate/delete? 【发布时间】:2012-01-30 00:10:16 【问题描述】:

我有一组暂存表,我在其中接受数据、清理和清理它们,然后再插入目标表。目标表有一个主键约束,我插入的是一个主键。

我在插入之前检查目标表中是否缺少主键。根据主键的缺失,我只插入不在目标表中的记录:

INSERT INTO Target
    SELECT 
        primKey
        , user_state
        , test_state
    FROM
        myStagingTable3

此时,stagingTable3 仅包含目标表中不存在的数据,使用以下 where 子句:

WHERE
        primKey not in (Select primKey from Target)

不知何故,我遇到了主键违规错误:

消息 2627,级别 14,状态 1。(程序在第 # 行失败...) 违反主键约束“pk1101AE”。无法插入 对象“目标”中的重复键

我的问题:

在什么情况下会发生主键违规 我要插入的键不存在于目标表中? 之前删除记录会导致保留主键吗?如果是这样的话, 我能以某种方式解决这个问题吗? 还有别的吗?

很明显,我的临时表有键,而目标表没有。然而插入失败。

【问题讨论】:

我应该补充一点,我读了这篇文章:***.com/questions/5278588/… 删除/截断问题很有趣。只是不知道如何解决它。在这方面有点菜鸟。谢谢。 您的临时表很可能包含多个 primKey 值。 嗯,我刚刚检查过......这是真的......它确实有多个primKey值。这意味着 SECOND 键值是导致错误的原因,因此整个事情都被保释并且事务被回滚。如果我不能清除重复项,我可能会在这里查看 MERGE 语句。这样,我也可以在插入后更新。总是检查简单的东西 【参考方案1】:

发生这种情况是因为您的临时表包含具有相同 primKey 值的多行。

如果您不关心重复中的哪对 user_state, test_state 将其放入插入中,您可以通过添加一个简单的 group by 来完全绕过该问题,如下所示:

INSERT INTO Target
    (SELECT 
        primKey
    ,   MAX(user_state)
    ,   MAX(test_state)
    FROM
        myStagingTable3
    GROUP BY primKey)

【讨论】:

以上是关于在sql server中truncate、delete、drop删除表的区别,详细点,越详细越好。的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Transaction Log Truncate && Shrink

SQL Server删除表及删除表中数据的方法

sql server中如何快速批量删除表里的百万条记录!直接用delete top(50000)还是有点慢...

sqlserver 怎么清空表

django 在 SQL Server 中指定列排列

php删除sql数据库的语句