随笔 - 746  文章 - 0  评论 - 39  阅读 - 79万

Sqlserver:教训啊:具有foreign key 约束的表不可用使用 truncate 语句

教训:

  一个业务数据库。需要清理某些表的数据。想当然的用 truncate table,结果总是:

1
消息 4712,级别 16,状态 1,第 1 行无法截断表 'xxx',因为该表正由 FOREIGN KEY 约束引用。
当时在客户那里,想了半天,用尽了平时用到的所有方法,手工一一执行相关表的truncate,利用数据字典编写自动的脚步,均未果!

两个小时过去了,自己也心烦气躁,心里越来越没有底。最后,放弃了。

 

之后,又耗费了几个晚上研究该问题,总是无法解决。不经意间,换了delete 语句,成功。再查看online books 发现有如下表述:

复制代码
truncate 注释
注释
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。
复制代码

 

 

哎!

基础知识不牢啊!!!!!!!!!!!!!!!!!

谨记。

 

 

 

 

 

posted on   jinzhenshui  阅读(3483)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2008-12-27 Oracle支持的外部过程

点击右上角即可分享
微信分享提示