登陆注册
8724600000021

第21章 数据分析、设计及实现(4)

5.3.3如何获得自动增长量

在表中设置自动增长量作为主键来唯一标识一条记录,例如上面例子中主表T_Order的列DetailID就是自动增长量。在SQL语句中,可以用@@IDENTITY获得插入一条数据后系统分配的自动增长量。例如:

INSERT T_Order(OrderDate,Vendor,TotalPrice)

Values(’2003—1—1’,’上海理工’,100)

select@@IDENTITY

5.3.4如何手动实现自增长的编码

使用系统的识别列(Identity)属性时,该列只能是整形,但是在很多情况下的表是有意义的,所以就要求手动实现主键自增长的功能。如果第一个类别为1001,第一个同层次的类别的编码就应该是1002,当要插入1001的子类别时,他的第一个自类别应该是10011001,第二个自类别应该是10011002,显然编码自身是有意义的,每个非根节点的编码的左边四位就是其父节点的编码。

可以用例5.1所示的函数实现按上面描述的规则自动生成ID的功能。当传入一个父类ID时,函数首先查找到该类别中的小类最大的编码,如果没有找到,说明该类别还没有小类,此时返回该类别中的小类的第一个编码,否则返回最大的编码加一之后的编码。

例5.1create FUNCTION dbo.fun_GenarateCategoryID(@id varchar(8))

RETURNS varchar(40)

AS

BEGIN

declare@max as varchar(40)

select@max=max(Categoryid) from category

where ParentCategoryID=@id

if@max is null

if@id=’0’

set@max=’1001’

else

begin

set@max=@id+’1001’

end

else

begin

set@max=cast(@max as bigint)+1

end

return@max

END

例5.2

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’0’),’服装’,’服装大类’,’0’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’1001’),’西服’,’西服小类’,’1001’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)values(dbo.fun_GenarateCategoryID(’1001’),’夹克’,’夹克小类’,’1001’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’1001’),’毛衣’,’毛衣小类’,’1001’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’10011003’),’全羊毛衣’,’毛衣的更小的类别,’10011003’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’10011003’),’50%羊毛衣’,’毛衣的更小的类别’,’10011003’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’0’),’农业’,’农业大类’,’0’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’1002’),’粮食’,’粮食小类’,’1002’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’1002’),’饲料’,’饲料小类’,’1002’)

go

insert category(CategoryID,CategoryName,Remark,ParentCategoryID)

values(dbo.fun_GenarateCategoryID(’0’),’食品’,’食品大类’,’0’)

go

使用例5.2的脚本插入数据,得到结果,显然所有的编码按照我们自定义的规则在自动增长。

5.3.5如何实现出入库类型的表

为了保持数据的一致性,在插入进货表和出库表的时候,同时要修改货物表中的库存。这里用触发器来实现。

进货触发器:在插入进货表的时候,自动更新货物库存。

CREATE TRIGGER Tri_InStore ON dbo.T_InStore

FOR insert

as

begin tran

declare@Num int

select@Num=InStoreNum

from inserted

update T_Product

set ProductStoreNum=ProductStoreNum+@Num

where ProductID in

(select ProductID from inserted)

if@@error>;0

rollback tran

else

commit tran

出货触发器:在插入出货表的时候,首先判断出货数量是否大于库存量,如果小于库存量,自动更新货物库存。

CREATE TRIGGER Tri_OutStore ON dbo.T_OutStore

FOR insert

as

begin tran

declare@StoreNum int

declare@Num int

select@StoreNum=ProductStoreNum

From T_Product

Where T_Product.ProductID in

(select ProductID from inserted)

select@Num=OutStoreNum

from inserted

if@StoreNum<;@Num

rollback tran

update T_Product

set ProductStoreNum=ProductStoreNum@Num

where ProductID in

(select ProductID from inserted)

if@@error>;0

rollback tran

else

commit tran

以上完成的触发器都是针对一条记录的插入操作来实现的。如果进行批量录入,则需要使用游标,循环读出插入值,每读出一条记录值,便更新相应库存数量。

5.3.6如何查询快要过期的产品

在数据库的查询中,对于时间的操作非常普遍,经常会碰到日期的处理和计算问题。下面主要介绍DATEDIFF函数的操作,DATEDIFF函数返回跨两个指定日期的日期和时间边界数。举个例子,计算并返回2008—1—1至2008—12—26之间有几个星期,这里我们就要用到DATEDIFF函数,语句如下所示:

select DATEDIFF(week,’2008—1—1’,’2008—12—26’)as weeknum

DATEDIFF的语法为DATEDIFF(datepart,startdate,enddate)

其中startdate和enddate分别为起始日期和结束日期,datepart是规定在日期的哪一部分计算差额的参数。Datepart参数可以取年、月、星期、日、小时等。

5.3.7如何查询各门课的第一名的成绩

在查询中经常会遇到类似的问题,查询操作首先要将各门课的成绩分组,然后在各个组中找到最高分。这里主要结束分组操作:Groupby。

Groupby用于select语句中,指定用来放置输出行的组,指定Groupby时,选择列表中任一非聚合表达式内的所有列都应包含在Groupby列表中,或者Groupby表达式必须与选择列表表达式完全匹配。下面是查询各门课的第一名的成绩的SQL语句:

Select course,max(mark)

From T_courses

Group by course

5.3.8如何将SQL上的数据导出并还原到另一台机器数据库的备份操作步骤如下:

①选中需要备份的数据库。

②单击右键,选择【所有任务】,单击【备份数据库】。

③在【常规】选项卡中选择备份类型,可以选择【完全备份】。

④单击【目的】中的【添加】,为数据库选择备份的目的地。

⑤在【重写】单选框中,用户选择【追加到媒体】,那么数据库备份将从文件的最后一行开始。如果用户选择【重写现有媒体】,那么将会覆盖文件中的原有内容。

数据库的还原操作步骤如下。

①首先,在SQL Server中建立一个和目标数据库同名的空数据库。

②选中数据库,单击右键,选择【所有任务】,单击【还原数据库】。

③在【常规】选项卡中,选择【还原】中的【从设备】。

④在【参数】中单击【选择设备】。

⑤在【选择还原设备】中,单击【还原自】中的【添加】。

⑥在【选择还原目的】中,选中【文件名】,单击右边的按钮,来选择还原文件。

思考题

1.逻辑设计的目的是什么?

2.设某商业集团数据库中有三个实体集:一是“商店”实体集,属性有商店编号、商店名、地址等;二是“商店”实体集,属性有商品号、商品名、规格、单价;三是“职工”实体集,属性有职工编号、姓名、性别、业绩等。商店与商品间存在“销售”联系,每个商店可销售多种商品,每种商品也可放在多个商店销售,每个商店销售每一种商品,有月销售量;商店与职工间存在着“聘用”联系,每个商店有许多职工,每个职工只能在一个商店工作,商店聘用职工有聘期和月薪。试画出ER图,并在图上注明属性、联系的类型。再转换成关系模式集,并指出每个关系模式的主键和外键。

3.数据库的实现需要完成哪些工作?

4.简述SQL Server2000中备份与还原数据库的步骤。

同类推荐
  • 体感交互技术

    体感交互技术

    本书提出了体感计算的研究,探讨了基于体验性认知的个性化电子学习方式,并且分析了面向儿童的艺术创造体验,在体感虚拟化身的帮助下,用户可以通过身体运动,促进情感心智的全面发展,
  • 如何建设网站

    如何建设网站

    本书以问答的方式介绍了建设网站的基本知识,内容包括:网站设计的八个步骤、建设网站需要掌握的工具软件、网页中插入图像、在网页中隐藏内容等。
  • 爱上我的“手机女友”

    爱上我的“手机女友”

    本书共有五个部分:第一章:千娇百媚的我—手机门类大搜索第二章:了解我的心—手机“芯”理学第三章:不一样的我不一样的美—手机的万种风情第四章:命中注定我爱你—神秘手机星座解读第五章:有求必应贴心女友—手机的绝世武功通过这本书,想要购入手机的你会知道哪款手机女友更适合你,已有心仪手机的你可以让手机女友懂得更多变得更聪明。希望这本书能够帮助你在手机选购上和手机使用上更舒心、安心、贴心。
  • 初级会计电算化

    初级会计电算化

    本书是作者根据历年会计从业资格考试的考试大纲以及多年对真题的分析,并结合多为专家、学者的实践经验而编写的。本书主要分为八套模拟试卷,以对考生考前的学习进行模拟实战,达到提高考生成绩的目的。
  • 玩转手机

    玩转手机

    本书主要包括:手机的发展历史、手机知识、手机的选购与巧用、手机与网络、手机短信等内容。
热门推荐
  • 时代网游

    时代网游

    一场游戏的革命……一个时代的消亡……当两者发生碰撞的瞬间,新的时代即将诞生!!!!!求藏求推荐。
  • 冻天冰仙

    冻天冰仙

    一场六界大乱斗……冰雕少女夹缝中求生存!天帝、魔尊、妖王……谁敌谁友?逃避、坚持、背叛……谁是谁非?还好,小命无虞。还好,男神犹在。 —— 新书《小样儿别装了》欢乐上线!(-^O^-)
  • 西游记

    西游记

    《西游记》是我国古代文学四大名著之一。它主要取材于唐朝太宗时期,著名僧人唐玄奘受皇命上当时的天竺,即现在的印度,去取佛经。本书故事就是以此心怀慈善,身体又柔弱的唐僧为主要人物之一,他在神通广大、会七十二变武艺的孙悟空,偷懒、好色成性但力气满身的猪八戒以及诚厚老实、忠心耿耿的沙悟净的保护下,降妖伏魔,历经七七四十九难,成功完成皇命,取回真经,修成了正果。它向人们展示了一个绚丽多彩的神魔世界,人们无不在作者丰富而大胆的艺术想象面前惊叹不已。
  • 网游之大海贼时代

    网游之大海贼时代

    “征服这片海,是每个男人的梦想。”“不要妄想从我的船边经过,除非你游过去。”“你知道我和他们最大的区别是什么吗?那就是我能忍,但他们不会。所以,我是最后的霸者,他们只是我成功的垫脚石。”——林凡
  • 兵神之尚武征途

    兵神之尚武征途

    《兵神》上部:尚武征途——“放下尊严,邀你们去赴以生命为代价的宴席。”辽阔华夏大地,风起云涌,武盟兴起,中天武圣傲视群雄,以尚武之心直指神圣王座。昔日剑神遗子,且行且思,遍历九州,侠义无双仗剑天涯,凭一己之力颠覆天下苍生。
  • 匹夫之怒
  • 嫡女雪姬

    嫡女雪姬

    虞雪姬是灾星?刚出生就克死了母亲,还没过门又克死了未来婆母。老爹不待见,继母虐待,从小生活在水深火热之中。幸好祖母垂怜!遭退婚后,自强自立,进宫去,自己挣钱养活自己!别欺负她,她是九皇子一见钟情的奇女子。谁叫她人见人爱,花见花开。倾国倾城?雪姬美艳不可方物。就是这么任性。刚成王妃,就同王爷一起到北齐做人质?别着急,王爷回来以后,就继承江山社稷了。手无缚鸡之力的弱女子,从此成为大周朝的皇后。妃嫔可以无数,皇后却只能是一个。失宠?后宫万紫千红,周慕白却始终独宠她一个,宠冠六宫。虞雪姬这个女人,终究是要做太后的。
  • 重生地球,黑白女王归来

    重生地球,黑白女王归来

    《疯了,重新来,别点这个》三个平行世界等待着她的到来。灵力,鬼术,通灵术等异能,默紫银又当如何应用?未知的身份,未知的人,正在一步一步的逼近,默紫银到底是谁?面对重生,真的是巧合吗?
  • 六扇天尊

    六扇天尊

    “一归九,九归一,天地元气,任我摄取,,,,,!”国师一边掐算,一边将八宝琉璃瓶中的元气放出,用来供他推演。“一个光怪陆离的世界,一个背着包裹的男子,牛头马面,绝美仙人,然后便是层层云雾,然后便是望辽县,,,,,!”“望辽县,难道是那战凌霄,,,,,?”突然一股天地之力反噬,国师面上突然一白,手中的浮尘都已经抓不住了。“噗!”一口鲜血喷出,国师颓然的后退几步,望着自己面前掉落在地的浮沉上的点点血迹,国师凄然的笑了笑。“果然这天地乱象不是我这种修为所能够窥探得了的阿!”
  • 网王之陌上花开

    网王之陌上花开

    若将莫须有的都一并消失该多好?也许、到最后什么都没有了罢。——————————————她是遗落在人间的恶魔吧?怎么会知晓所有的事。如果...那一切都没有发生该多好?层层迷雾过后,记忆撒碎在人间,谁...又能待她如初?陌上.花.开了。花开幽香,花落成殇。回眸处,流年浅唱着一地的忧伤......