落差表(Transact-SQL)

适用于:Microsoft Fabric 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Warehouse

删除一个或多个表定义以及这些表的所有数据、索引、触发器、约束和权限规范。 任何引用已删除表的视图或存储过程都必须使用 DROP VIEWDROP PROCEDURE 显式删除。 若要报告表的依赖关系,请使用 sys.dm_sql_referencing_entities

Transact-SQL 语法约定

语法

-- Syntax for SQL Server, Azure SQL Database, Warehouse in Microsoft Fabric

DROP TABLE [ IF EXISTS ] { database_name.schema_name.table_name | schema_name.table_name | table_name } [ ,...n ]
[ ; ]
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

DROP TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[;]

参数

database_name

要在其中创建表的数据库的名称。

Azure SQL 数据库支持三部分名称格式 database_name.schema_name.object_name ,当 database_name 是当前数据库 或 database_nametempdbobject_name###开头时。 Azure SQL 数据库不支持四部分名称。

IF EXISTS

适用范围:SQL Server(SQL Server 2016 (13.x) 到当前版本)。

有条件地删除表(仅当其已存在时)。

schema_name

表所属架构的名称。

table_name

要删除的表的名称。

备注

DROP TABLE 不能用来丢弃被约束引用 FOREIGN KEY 的表。 必须先丢弃引用 FOREIGN KEY 约束或引用表。

同一 DROP TABLE 语句中可以丢弃多个表。 如果在同一语句中,约束中的 FOREIGN KEY 引用表和带有引用主键或唯一键的表都被丢弃 DROP TABLE ,则引用表必须放在首位。

删除表时,表的规则或默认值将被解除绑定,与该表关联的任何约束或触发器将被自动删除。 如果要重新创建表,则必须重新绑定相应的规则和默认值,重新创建某些触发器,并添加所有必需的约束。

如果你用语句删除表 DELETE 中的所有行,或者用语 TRUNCATE TABLE 句,表定义会一直存在,直到被用 丢弃 DROP TABLE

如果你丢弃一个包含 varbinary(max) 带有属性的 FILESTREAM 列的表,文件系统中存储的任何数据都不会被删除。

删除账本表后,也会删除其依赖对象(历史记录表和账本视图)。 历史表或账本视图不能直接丢弃。 系统在丢弃账本表及其依赖对象时会强制执行 软删除 语义——它们实际上并未被丢弃,而是在系统目录视图中标记为丢弃并重命名。 有关详细信息,请参阅账本注意事项和限制

重要

DROP TABLE 并且 CREATE TABLE 不应该在同一批次的同一张表上执行。 否则,可能出现意外错误。

在 Fabric SQL 数据库中,丢弃表会同时从数据库和 Fabric OneLake 中移除该表。 丢失表的所有镜像数据都会被移除。

延迟分配

当一个表被丢弃,且该表或其索引有128个或更多时,数据库引擎会推迟实际的页面释放及其关联锁,直到事务提交之后。 表格和索引分为两个独立阶段:逻辑和物理。 在逻辑阶段,现有的分配单元被标记为释放对象并锁定,直到交易提交。 在物理阶段,后台流程会移除标记为释放的页面。 这意味着释放的 DROP TABLE 空间可能无法立即用于新分配。

如果启用 了加速数据库恢复 ,则无论扩展数量多少,都会使用不同的逻辑和物理阶段。

权限

需要对该表所属的模式拥有 ALTER 权限、 CONTROL 对表的权限,或是 db_ddladmin 固定数据库角色的成员身份。

如果语句丢弃了账本表,则需要该 ALTER LEDGER 权限。

示例

A. 删除当前数据库中的表

以下示例将从当前数据库中删除 ProductVendor1 表及其数据和索引。

DROP TABLE ProductVendor1;

B. 删除其他数据库中的表

以下示例将删除 SalesPerson2 数据库中的 AdventureWorks2025 表。 可以在服务器实例上的任何数据库中执行此示例。

DROP TABLE AdventureWorks2022.dbo.SalesPerson2 ;

C. 删除临时表

以下示例创建一个临时表,测试其存在性,丢弃它,然后通过尝试执行 SELECT 一个语句(但失败)再次测试其存在。 本示例未使用 IF EXISTS 自 SQL Server 2016(13.x)开始可用的语法。

CREATE TABLE #temptable (col1 int);

INSERT INTO #temptable
VALUES (10);

SELECT col1 FROM #temptable;

IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL
  DROP TABLE #temptable;

SELECT col1 FROM #temptable;

D. 使用 IF EXISTS 删除表

适用范围:SQL Server(SQL Server 2016 (13.x) 到当前版本)。

以下示例创建名为 T1 的表。 然后,第二条语句删除表。 第三个语句没有执行任何作,因为表已经丢弃,但它不会引起错误。

CREATE TABLE T1 (Col1 int);

DROP TABLE T1;

DROP TABLE IF EXISTS T1;