登陆注册
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中备份与还原数据库的步骤。

同类推荐
  • 高校校园网管理与网上引导工作研究

    高校校园网管理与网上引导工作研究

    在当今的信息化潮流之下,我们不可否认互联网的出现,绝不仅仅是传送手段的变化,更重要的是它代表着一种新的社会形态——网络社会的来临。互联网已经以一种前所未有的方式渗透到现代社会的各个层面和领域,成为现代社会前进和发展的动力和工具,它推动了社会经济、文化政治实现所谓的“数字化转变”。
  • 信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络

    信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络信息技术教育大全-计算机网络
  • 黑客就在你身边

    黑客就在你身边

    互联网络正在改变着我们的生活,每个人都处在互联网的天罗地网之中。本书以轻松的笔调,向人们介绍了有关“黑客”的知识。当你读完这本书后,你会发觉“黑客”一点都不神秘,他们渴望全社会对他们有一个公正的评价。
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
  • Delphi程序设计教程

    Delphi程序设计教程

    本书为适应不同层次读者的需要,从Delphi的基本知识讲起,由浅入深,全面讲述了Delphi的集成开发环境、Delphi的编程语言——ObjectPascal、常用组件的使用、窗体的设计、菜单的设计、对话框的设计、多文档界面程序的设计、多媒体编程和数据库应用程序设计等内容。
热门推荐
  • 斗炎圣帝

    斗炎圣帝

    传说中的东玄域,圣域,异界,远古大陆在洪荒之期战事不断直到异界宫主与远古大陆王者展开了生死决战!大战过后大陆分离,再度和平。殊不知时空破碎,魔兽肆虐,人类存亡之危急!林衍会不会成为大陆之上受人敬仰的圣帝,为大陆解除危机....
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 梦魇猎杀

    梦魇猎杀

    火山中沸腾着灼热的鲜血,天空飘荡着红色的雨滴。韩辰缓缓的在森白枯骨铺就的地上行走着,看着远处依旧遥远的挂满骷髅的巨树,默默地叹了口气:“这只梦魇胆子真小……”
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 在柯南世界发展偶像事业

    在柯南世界发展偶像事业

    “和田老师,请问如果需要感谢一个人,请问您想感谢谁?”记者访谈时刻,和田闭上眼睛,思考了半许,再次抬头时候眼神中已经有了答案。“如果只能选择一个人的话,那么我想感谢我的经纪人,因为在我最不得志的时候,是他找到了我,到现在我还记得他十多岁穿着校服走到我面前,很自然的说要成为我的经纪人,即使我消沉的状态都没有改变他。”“没想到还有这段往事呢。”“是的啊,诶,你怎么了?”和田光司默默看着面前倒地的主持人,忽然间有些慌张,看向后台的门。门打开来了,还是那个熟悉的友人,自己的经纪人,小跑到自己面前,开始安抚自己。“和田老师,不用担心,小事情,只是工藤洗衣机来了而已。”——————催更群号:1143593467
  • 我的傲娇美女大小姐

    我的傲娇美女大小姐

    一名隐居深山的少年,如何在这风云大世力挽狂澜,一步步在修仙之路不断迈进。
  • 势不两立

    势不两立

    人有三罪。一罪断其手,二罪割其喉,三罪主死仆生灭其家。凡犯此三罪者,皆死。ps:悬疑案件较多,智商不够请绕道。
  • 闹市听“花”开:性心理咨询个案实录(高校青春季)

    闹市听“花”开:性心理咨询个案实录(高校青春季)

    本书实录了笔者十多年来从事心理咨询工作所经手的12个案例。分为同性之爱、忘年之恋、爱之迷茫、情之困境、性之诱惑五个板块,涉及了青年朋友们在爱情、婚姻生活方面一般性心理困惑的咨询。