
2007年5月8日
刚学到的,并不新鲜;
里面的两个表示例是在网上随便找的,希望没有侵权.
-----------------------sql语句的几个知识点-----------------------------
--以如下两个表为例
-------------------------- 创建表author ---------------------------------
create table author(
id int not null,
AuthorName varchar(20) null,
address varchar(50) null,
introduction ntext null
)
--------------------------- 创建表article---------------------------------
create table article(
id int identity(1,1) not null,
authorId int not null,
title varchar(40), not null,
createdDate datetime
)
--------------------------------------------------------------------------------
--1,为author表添加主键信息
alter table author
add constraint pk_author --这个命名并没有多大的实际意义
primary key(id)
--2,外键
--设置表article中的authorId为外键,参照author表的主键id字段
alter table article add constraint fk_article_author--这个命名也是一样,没有多大实际意义
foreign key (authorId)
references author(id)
on update cascade
on delete cascade
--上面on update cascade,on delete cascade两个选项,
--指明以后author表的id字段有delete,update操作时,
--article表中的iauthorID也会被级联删除或更新.
--3删除约束
alter table article drop constraint fk_article_author
--这里的命名就是上面新建约束时的命名
--新建某个表时,有时需要先检查一下是否已经建了这个表,如已建了,则删除之
if exists
(
select id from sysobjects
where id = object_id('author') --如果系统表中有这个对象
--and sysstat & 15 = 3 --并且这个对象类型是"表"(Sybase中的方式)
and objectproperty(id,'istable') = 1 --并且这个对象类型是"表"(SQL Server中的方式)
)
drop table author --那么删除之
go
--然后新建该表
create table author(
id int not null,
AuthorName varchar(20) null,
address varchar(50) null,
introduction ntext null
)
go
--这里我发现一个有意思的问题.开始我使用系统表sysobjects里“sysstat & 15 = 3"来判断某个表是否已经存在;
--后来想到这是我在sybase项目里先使用的,不知道在SQL Server里是不是有效.于是又找了个SQL Server里常用的方法
--就是判断系统表sysobjects里的objectproperty(id,'istable') 值是否为1,如果是1,那么这就是"表";否则这就不是表.
--于是我仔细看了下M$ SQL Server里的系统表sysobjects,发现里面也有sysstat列,那么使用“sysstat & 15 = 3"来判断是否为表,应该也可以吧?
--于是打开查询分析器,use NorthWind,然后
select name from sysobjects
where sysstat & 15 = 3
--结果正是NorthWind里的各个表
----Orders
----Products
----Order Details
----CustomerCustomerDemo
----CustomerDemographics
----Region
----Territories
----EmployeeTerritories
----Employees
----Categories
----Customers
----Shippers
----Suppliers
--那么刚才提到的系统表sysobjects里的objectproperty(id,'istable') 值是否为1的方法呢?
--试一下吧.
select name from sysobjects
where objectproperty(id,'istable') = 1
--啊!返回这么多!
/* Categories
CustomerCustomerDemo
CustomerDemographics
Customers
Employees
EmployeeTerritories
Order Details
Orders
Products
Region
Shippers
Suppliers
syscolumns
syscomments
sysdepends
sysfilegroups
sysfiles
sysfiles1
sysforeignkeys
sysfulltextcatalogs
sysfulltextnotify
sysindexes
sysindexkeys
sysmembers
sysobjects
syspermissions
sysproperties
sysprotects
sysreferences
systypes
sysusers
Territories */
--仔细看下,其实这里面包含了系统表.
--------------------------------------------------------------------
--由此看来,"sysstat & 15 = 3"不仅在Sybase中可以使用,在M$ SQL Server里也可以;而且在这里更合适.因为我们操作的都不是系统表.
--至于objectproperty(id,'istable')方法,我查了一下msdn,具体情况见http://msdn2.microsoft.com/zh-cn/library/ms176105.aspx.
--objectproperty函数的第二个参数可以是isSystemTable用来判断对象是否系统表.
--这下好说了,且看
select name from sysobjects
where objectproperty(id,'istable') = 1
and objectproperty(id,'isSystemTable') = 0
--输出
/* Categories
CustomerCustomerDemo
CustomerDemographics
Customers
Employees
EmployeeTerritories
Order Details
Orders
Products
Region
Shippers
Suppliers
Territories */
--搞定!
---------------------------------------------------------------------------------------
--看来SQL实在是精妙而又庞大,我所能理解的无非那几句create,update,delete,select而已,
--不过是浩瀚的知识海洋中的一滴水,九牛之一毛,树林之一木.
--加油!
posted @ 2007-05-08 17:03 小白杨 阅读(187) 评论(0)
编辑