日期:2014-05-16  浏览次数:20544 次

第八章 数据修改(2)
use tempdb;
go

if OBJECT_ID('dbo.Orders', 'U') is not null  
drop table dbo.Orders;  
  
create table dbo.Orders  
(  
orderid int not null  
constraint PK_Orders primary key,  
orderdate date not null  
constraint SFT_Orderdate Default(Current_timestamp),  
empid int not null,  
custid varchar(10) not null  
);  

--8.1.5 BULK INSERT语句
--BULK INSERT语句用于将文件中的数据导入一个已经存在的表

BULK insert dbo.orders from 'E:\orders.txt'
with(datafiletype = 'char',
fieldterminator = ',',
rowterminator = '\n'
);

--8.1.6 IDENTITY属性
--当把值插入(Insert)有标识列的表时,数据库引擎会根据列定义中提供的
--一个种子(seed,第1个值)和增量(步长值)自动生成递增的标识值。
if OBJECT_ID('dbo.t1', 'u') is not null drop table dbo.t1;

create table dbo.t1
(keycol int not null identity(1,1)
constraint PK_T1 primary key,
datacol varchar(10) not null
constraint chk_t1_datacol check(datacol like '[A-Za-z]%')
);

--在insert语句中,应该完全忽略标识列,就像她们在表中不存在一样
insert into dbo.t1(datacol) values('AAAA');

--如果须要获得这个新生成的标识符,可以查询以下两个函数之一:@@identity和scope_identity()。
declare @new_identity as int;
insert into dbo.t1(datacol) values('AAAAAA');
set @new_identity = SCOPE_IDENTITY();
select @new_identity as new_identity;

--@@identity和scope_identity都是返回当前会话生成的最后一个标识值。不过,如果你想知道一
--个表当前的标识值而不考虑作用域,则应该使用ident_current函数,并将表明作为其输入参数
select IDENT_CURRENT('dbo.t1') as new_identity;


--标识属性要注意的另一个重要地方是,不能在现有的列上增加或删除标识属性,只能用create table
--语句或旨在增加新列的alter table语句,在定义列的同时一起定义标识属性.
--标识属性并不会强制实施唯一性约束.如果想要保证标识列的唯一性,可以在标识列上另外同时定义
--一个主键或唯一性约束.

--8.2 删除数据
if OBJECT_ID('dbo.orders', 'u') is not null drop table dbo.orders;
if OBJECT_ID('dbo.customers', 'u') is not null drop table dbo.customers;

select * into dbo.customers from TSQLFundamentals2008.Sales.customers;
select * into dbo.orders from TSQLFundamentals2008.Sales.Orders;

alter table dbo.customers add
constraint PK_Customers primary key(custid);
alter table dbo.orders add
constraint PK_Orders primary key(orderid),
constraint FK_Orders_Customers foreign key(custid)
references dbo.customers(custid)

--8.2.1 DELETE语句
delete from dbo.orders where orderdate < '20070101'
--Delete当删除大量数据时,可能会花费大量时间

--8.2.2 TRUNCATE语句
--TRUNCATE语句不是标准的SQL语句,它用于删除表中的所有行.与DELETE语句不用,
--TRUNCATE不需要过滤条件. TRUNCATE的效率比较快,执行速度非常快.
truncate table dbo.t1

--当表中有标识列时,TRUNCATE和DELETE在功能上有所不同.TRUNCATE会把标识值重
--置为最初的种子,而delete则不会.

--当目标表是由外键约束引用的表时,SQL Server将不允许对这样的表使用TRUNCATE
--语句,即使引用表为空或外键被禁止也是如此。

--8.2.3 基于联接的DELETE
--T-SQL支持一种基于联接的DELETE语法,可以根据对另一个表中相关行的属性定义
--的过滤器来删除表中的数据行。

delete from o
from dbo.orders as o
join dbo.customers as c
on o.custid = c.custid
where c.country = N'USA';

delete from dbo.orders
where exists
(select * from dbo.customers as c
where c.custid = dbo.orders.custid
and c.country = N'USA');