表格的truncate
,drop
和delete
有什么区别?何时选择哪个?有没有人有一个快速的比较?我已经看到了很多关于这方面的信息,但还没有在清晰的概述中找到它。我希望这篇文章有助于理解。表的截断,删除和删除有什么区别?何时选择哪个?
我的意思是像在T-SQL这些语句中使用:
truncate table TableX
drop table TableX
delete table_name
表格的truncate
,drop
和delete
有什么区别?何时选择哪个?有没有人有一个快速的比较?我已经看到了很多关于这方面的信息,但还没有在清晰的概述中找到它。我希望这篇文章有助于理解。表的截断,删除和删除有什么区别?何时选择哪个?
我的意思是像在T-SQL这些语句中使用:
truncate table TableX
drop table TableX
delete table_name
基于由@Michal here答案,多一些搜索我做了下面的语句下面的对比(在T-SQL ):truncate table TableX
,drop table TableX
和delete 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 delete
的preferences 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
如果您添加级联效果(在所有3种情况下),我会upvote! – jarlh
@jarlh:我会,如果我可以......对于当前的比较表,它是没有意义的,因为当添加一个主键'删除级联'下降和截断不会工作。但让我考虑一下。添加一些关于自动删除子数据的可能性的信息不是一个坏主意! – cybork
依赖对象,如视图,触发器,外键(包括隐式索引) – jarlh