第八章 数据修改(2)
use tempdb;goif 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 nullconstraint 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 addconstraint PK_Customers primary key(custid);alter table dbo.orders addconstraint 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 ofrom dbo.orders as ojoin dbo.customers as con o.custid = c.custidwhere c.country = N'USA';delete from dbo.orderswhere exists(select * from dbo.customers as cwhere c.custid = dbo.orders.custidand c.country = N'USA');