2015-09-10 43 views
0

表格的truncate,dropdelete有什么区别?何时选择哪个?有没有人有一个快速的比较?我已经看到了很多关于这方面的信息,但还没有在清晰的概述中找到它。我希望这篇文章有助于理解。表的截断,删除和删除有什么区别?何时选择哪个?

我的意思是像在T-SQL这些语句中使用:

truncate table TableX 
drop table TableX 
delete table_name 

回答

3

基于由@Michal here答案,多一些搜索我做了下面的语句下面的对比(在T-SQL ):truncate table TableXdrop table TableXdelete table_name

      Truncate   Drop     Delete 
Speed      [Fast]    Slow     Slowest 
Rolback possibility  No     No     [Yes] 
Specifiable conditions  No     No     [Yes] 
Scope      All records  All record+Headers Some records/All records 
               =whole table 
Cascading effects   No*    No*     [Yes]** 



**For example: in a Table_1 there is a PK, in Table_2 there is a FK that relates with 
the PK of Table_1, other words there is referential integrity. If the PK has `'ON DELETE CASCADE'` 
and `delete Table_1` is ordered, then the data in Table_2 will be deleted too, 
automatically. For more info about ON DELETE CASCADE and ON ALTER CASCADE, see: 
https://technet.microsoft.com/en-us/library/ms186973%28v=sql.105%29.aspx. 

Cascading does automatic alterations and deletes of depending objects such as foreign keys (FK), 
views, and triggers. Sometimes very useful, sometimes very dangerous.. 

*The drop and truncate statements of a Table_1 (with PK and FK in Table_2, as decribed 
in **) can't be executed, because the ssdms prohibits that. To accomplish the truncation 
or dropping of a Table_1: first get rid of the FK in Table_2, by altering the table design, or 
by dropping table2. 

看到比较基础的决定时所使用的语句...

作为一个拇指:

If you want to get rid of only records:当需要一个条件删除 使用删除,使用截断当所有记录可能会被删除。当你想能够回滚然后使用删除。

If you want to get rid of the whole table,包括标题(带有设置的列),然后选择放置。

If you want to get rid of values and automatically the related objects(并且表中定义了级联),使用delete。 (PS:在其他方言中,即使当表没有设计级联时,似乎也有办法实现它,但据我所知t-sql/msss中没有;但如果我错了,请纠正我)

PS:如果你想alter or deletepreferences of a column,然后(在T-SQL方言)使用方法:

阿尔特:

alter table tableX 
alter columnX datatypeX 

删除:

alter table tableX 
drop column columnX 

--And here's some code to play with 
--table to truncate, drop or delete 

create table TableX(
     [Name] [nchar](25) null, 
     [ID_Number] [int] not null) 


--tables with PK and FK 
create table Table_1(
     [Name] [nchar](25) null, 
     [ID_Number] [int] not null primary key) 

create table Table_2(
     [ID_Number] int not null foreign key references Table_1(ID_Number) on delete cascade, 
     [Buys] [int] null) 

--the on delete cascade make it happen that when a ID_Number is Table_1 is deleted, that row 
is automatically deleted in Table_2 too. But not the other way around, 
therefor alter the design of Table_1. 

insert into Table_1 (Name,ID_Number) values ('A',1),('B',2),('C',3); 
insert into Table_2 (ID_Number,Buys) values (1,10),(2,20),(3,30); 

select * from Table_1 
select * from Table_2 

truncate table table_2 
truncate table table_1 

drop table table_2 
drop table table_1 

delete Table_1 

delete from dbo.table_1 where name='A' 
delete from Table_1 where name like '%' 
delete from dbo.table_2 where ID_Number=2 
+0

如果您添加级联效果(在所有3种情况下),我会upvote! – jarlh

+0

@jarlh:我会,如果我可以......对于当前的比较表,它是没有意义的,因为当添加一个主键'删除级联'下降和截断不会工作。但让我考虑一下。添加一些关于自动删除子数据的可能性的信息不是一个坏主意! – cybork

+0

依赖对象,如视图,触发器,外键(包括隐式索引) – jarlh