若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。TRUNCATE TABLE 与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE 速度更快,并且使用更少的系统资源和事务日志资源。

与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点:

  • 所用的事务日志空间较少。

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

    当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。 
  • 如无例外,在表中不会留有任何页。

    执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。

1、直接删除数据表:delete from tablename 不可复位id

2、truncate table tablename //可复位id 

3、在2中,如果table中有外键,那么提示错误“无法截断表 'area',因为该表正由 FOREIGN KEY 约束引用。” 那么需要删除约束

delete from dbo.Region
   dbcc checkident('Region',reseed,0)  //将数据库中所有表的内容都删除
   use WaterMeterReadingDB
 select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'


 DECLARE tables_cursor CURSOR  
    FOR  
    SELECT name FROM sysobjects WHERE type = 'U' 
 OPEN tables_cursor   
  
 DECLARE @tablename sysname   
 FETCH NEXT FROM tables_cursor INTO @tablename     
 WHILE (@@FETCH_STATUS <> -1)    
 BEGIN  
  
    --Exec ('alter table ' +@tablename +' nocheck constraint all')
    EXEC ('delete from ' + @tablename)   
    EXEC ('DBCC CHECKIDENT('+ @tablename +',reseed,0)')
    --Exec ('alter table ' + @tablename +' check constraint all')
    FETCH NEXT FROM tables_cursor INTO @tablename 
 END

4、关于第三种方法,也可以先关掉数据库中的相关约束,然后truncate 表中的数据

  

1)禁止所有表约束的SQL
select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'

2)删除所有表数据的SQL
select 'TRUNCATE TABLE '+name from sysobjects where type='U'

3)恢复所有表约束的SQL
select 'alter table '+name+' check constraint all' from sysobjects where type='U'

4)删除某字段的约束
declare @name varchar(100)
--DF为约束名称前缀
select @name=b.name from syscolumns a,sysobjects b where a.id=object_id('表名') and b.id=a.cdefault and a.name='字段名' and b.name like 'DF%'
--删除约束
alter table 表名 drop constraint @name
--为字段添加新默认值和约束
ALTER TABLE 表名 ADD CONSTRAINT @name  DEFAULT (0) FOR [字段名]对字段约束进行更改
--删除约束
ALTER TABLE tablename
Drop CONSTRAINT 约束名
--修改表中已经存在的列的属性(不包括约束,但可以为主键或递增或唯一)
ALTER TABLE tablename 
alter column 列名 int not null
--添加列的约束
ALTER TABLE tablename
ADD CONSTRAINT DF_tablename_列名 DEFAULT(0) FOR 列名
--添加范围约束
alter table  tablename  add  check(性别 in ('M','F'))