一个关于truncate的问题

武哥博文 2009-12-23 12:52:01

use tempdb;

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table1](
[ID] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
[Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[Table1Ref](
[ID] [uniqueidentifier] NOT NULL,
[RefID] [uniqueidentifier] NOT NULL,
[DateAssigned] [smalldatetime] NOT NULL,
CONSTRAINT [UserRoleID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
GO
ALTER TABLE [dbo].[Table1Ref] WITH CHECK ADD FOREIGN KEY([RefID])
REFERENCES [dbo].[Table1] ([ID])

insert into Table1(ID, Name)
select newId(), 'A'
union
select newId(), 'B'
union
select newId(), 'C'

insert into Table1Ref(ID, RefID,DateAssigned)
select newid(),ID, getdate() from Table1

-----------clear data begin----
truncate table Table1Ref
truncate table Table1
-----------clear data end----

此时SQL Server会报出如下错误:
Msg 4712, Level 16, State 1, Line 2
Cannot truncate table 'Table1' because it is being referenced by a FOREIGN KEY constraint.

如果将clear data代码改成使用delete则执行成功
-----------clear data begin----
delete Table1Ref
delete Table1
-----------clear data end----
不知道truncate语句有何诡异之处?

...全文
201 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack_ailly 2009-12-23
  • 打赏
  • 举报
回复
Msg 4712, Level 16, State 1, Line 2
Cannot truncate table 'Table1' because it is being referenced by a FOREIGN KEY constraint.
错误提示很清楚啊。
武哥博文 2009-12-23
  • 打赏
  • 举报
回复
楼上的试过吗,加go依然不管用的,我试过,使用两个连接执行truncate table Table1Ref
和truncate table Table1都不管用
jack_ailly 2009-12-23
  • 打赏
  • 举报
回复
有外键约束。
nalnait 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 libin_ftsafe 的回复:]
try:

SQL codetruncatetable Table1Refgotruncatetable Table1go
[/Quote]
只要存在主外键关系就不行
nalnait 2009-12-23
  • 打赏
  • 举报
回复
有引用的表不能 TRUNCATE
子陌红尘 2009-12-23
  • 打赏
  • 举报
回复
try:

truncate table Table1Ref
go
truncate table Table1
go
aimee_99 2009-12-23
  • 打赏
  • 举报
回复
不能对以下表使用 TRUNCATE TABLE:

由 FOREIGN KEY 约束引用的表。
ziqing_1_2_3 2009-12-23
  • 打赏
  • 举报
回复
学习了
jack_ailly 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 grandtree 的回复:]
找到了
You cannot use TRUNCATE TABLE on a table referenced by a FOREIGN KEY constraint; instead, use DELETE statement without a WHERE clause. Because TRUNCATE TABLE is not logged, it cannot activate a trigger.

http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx
[/Quote]TRUNCATE TABLE 不能激活触发器,因为该操作不记录各个行删除。(联机丛书..)
csdyyr 2009-12-23
  • 打赏
  • 举报
回复
学习。
武哥博文 2009-12-23
  • 打赏
  • 举报
回复
找到了
You cannot use TRUNCATE TABLE on a table referenced by a FOREIGN KEY constraint; instead, use DELETE statement without a WHERE clause. Because TRUNCATE TABLE is not logged, it cannot activate a trigger.

http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx
pt1314917 2009-12-23
  • 打赏
  • 举报
回复

truncate的限制
不能对以下表使用 TRUNCATE TABLE:

由 FOREIGN KEY 约束引用的表。


参与索引视图的表。


通过使用事务复制或合并复制发布的表。
jack_ailly 2009-12-23
  • 打赏
  • 举报
回复
限制(联机丛书)
不能对以下表使用 TRUNCATE TABLE:
1.由 FOREIGN KEY 约束引用的表。(您可以截断具有引用自身的外键的表。)
2.参与索引视图的表。
3.通过使用事务复制或合并复制发布的表。

注:对于具有以上一个或多个特征的表,请使用 DELETE 语句。
武哥博文 2009-12-23
  • 打赏
  • 举报
回复
提示错误是很清楚,那么delete为什么就没有这样的错误。truncate同样是清空所有的数据,而且理论上比delete清的更彻底!
--小F-- 2009-12-23
  • 打赏
  • 举报
回复
有主外键约束引用的表不能使用TRUNCATE

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧