Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么可以';是否截断FK约束引用的表?_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql server 为什么可以';是否截断FK约束引用的表?

Sql server 为什么可以';是否截断FK约束引用的表?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,所以我试图理解为什么SQLServer2008R2在我尝试截断表时会抱怨 我有两张桌子: Parent(id,…) Child(id,parent\u id,…) 将子表作为FK约束(parent\u id)添加到parent表 现在,如果我尝试这样做: truncate table Child truncate table Parent 它给了我一个错误: 无法截断表“父”b/c它正被FK引用 约束 即使我对两个表都执行了删除操作(即表为空),我也无法截断父表 这是为什么?Truncat

所以我试图理解为什么SQLServer2008R2在我尝试截断表时会抱怨

我有两张桌子:

  • Parent(id,…)
  • Child(id,parent\u id,…)
将子表作为FK约束(
parent\u id
)添加到
parent

现在,如果我尝试这样做:

truncate table Child
truncate table Parent
它给了我一个错误:

无法截断表“父”b/c它正被FK引用 约束

即使我对两个表都执行了删除操作(即表为空),我也无法截断父表


这是为什么?

Truncate是DDL,而不是DML


因此,如果您截断一个表,您是在告诉数据库删除该表并重新创建它。

与删除内容相比,truncate更类似于删除并重新创建该表。它不进行检查等,因此如果清除数据可能违反任何限制,则禁止执行此操作。

SQL Server比此处需要的更为严格。即使禁用FK约束,也不允许这样做。TRUNCATE是DDL,因为它需要模式锁并将当前标识值重置为其种子。然而,我不确定将TRUNCATE分类为“非DML”是否有意义。它修改表中的数据就像删除一样。SELECTINTO是一个具有DDL和DML特性的语句的类似示例。无论如何,说它是DDL并不能回答这个问题。