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

同类推荐
  • 网络广告经纪人

    网络广告经纪人

    本书为网络广告经纪人培训认证的指定教材,该认证是商务部中国商务广告协会和信息产业部中国电子商会联合推出的,旨在为国家造就和培养出一大批网络广告梯队型人才。该教材包括网络广告经纪人的介绍和发展趋势,以及网络广告的原理、策划、设计、制作、发布与交换、效果评估、管理,以及网络广告营销的国内外最新的成功案例,还提供了一些常用的网络广告制作工具。本教材适合助理网络广告经纪人和网络广告经纪人层次使用。也可作为高校广告、电子商务等专业的教材。
  • 研究性学习丛书-电脑知识

    研究性学习丛书-电脑知识

    本书对电脑知识有一个全面详细的介绍,会对读者的电脑知识进行提高。
  • Delphi程序设计教程

    Delphi程序设计教程

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

    体感交互技术

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

    从平凡到神奇

    本书结合多年的开店经验,全面地讲解了在淘宝网开设店铺的相关知识,为准备在淘宝网创业的卖家及刚刚创建店铺的店主,提供全面的开店和经营方面的指导。本书按照淘宝开店的流程安排内容,侧重每个步骤中的实际技巧。本书分3个部分:如何在淘宝开店、如何开好店、如何做强做大店铺。前3章介绍了在淘宝网开设店铺的基础知识,指导读者在开设店铺前做好准备工作,以及建立起自己的店铺,并且完成店铺的第一笔交易;第4章至第7章主要介绍了网店装修和推广的方法,以及网店的物流经验和技巧;第8章着重介绍了将网店做大做强的方法,帮助卖家在开店和经营中树立品牌意识,做大做强自己的店铺。
热门推荐
  • 嚣张娃娃倾城妃

    嚣张娃娃倾城妃

    据说某公主倾国倾城,据说某公主心狠手辣,据说某公主神通广大,据说。。。。。。如果书好看就推荐给你身边的人吧!或是收藏,砸些票票吧!
  • 彼岸不变

    彼岸不变

    我爱你,故哪怕海枯石烂我都愿等你,唯你不可取代……
  • 变身九阴江湖游

    变身九阴江湖游

    一次意外,一名宅男穿越到了《九阴真经》的武侠世界,成了一名古墓派女弟子,一场劫难让她失去了师傅,为了保护自己的家,她毅然决然的踏上了寻找九阴真经的江湖路。初出茅庐的少女,面对江湖中的恩,诀,情,仇,痴,缘。她会如何?
  • 奥运励志故事

    奥运励志故事

    细细地品,从一滴汗水到一滴泪水。是什么让我们记下奥运冠军们光芒四射的名字?他们的身后有多少无法细列的困难被战胜,无法想象的寂寞被忍受?阅读它,赶紧阅读它——你总能找到属于你自己的奥运偶像。你总能读到你无法获知的激情人生。
  • 无限鬼神说

    无限鬼神说

    能否将命运的锁链挣开,完全取决自身的信念。无尽的杀戮,谁又逃的脱?
  • 天行

    天行

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

    天行

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

    我的主神玩家

    继承了一个宇宙的陈俊本以为自己可以做一个人生巅峰的创世神。谁知这个宇宙竟然已经病入膏肓,随时会崩灭毁坏。被破坏了念想的陈俊无比愤慨,于是决定招来了更加恐怖的存在来以毒攻毒——玩家侵蚀!沉寂!疯狂!死亡!整个宇宙都在旧日上位者的支配下颤栗。玩家:“你说啥?再说一遍?”————————————————我的主神玩家V群:678753654(需要500粉丝值!)之前的普通群炸了,这次米线直接建个V群!欢迎大家加入!
  • 宝贝惹上大明星

    宝贝惹上大明星

    她不知道为什么本该让人退避三舍的未婚妈妈突然就变得枪手起来了。她和她三岁的小儿子在两个优秀的男人之间进退两难。一个是以前狂热爱慕过的大明星,一个是现在的顶头上司!她想一定是老天在捉弄她才会让她陷入这样的两难境地!而她那乖巧的儿子的父亲到底是谁?又到底该是谁?
  • 天行

    天行

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