菜鸟请教高手用触发器维护数据库表的完整性问题(高分酬谢!)

wangliminde 2002-05-18 12:24:38
初次学习写触发器,心中非常迷惑,本来对数据库表中的外键功能理解就不好,学习的时候,在插删改时经常遇到关联出错,所以决定用触发器来代替外键!!但是要自己下手时又感到很为难,不知如何下手,我把表的结构写在下面,应该怎样建立触发,在哪几个表之间,只要说明功能就行,不必写出代码!(同时我把我的疑惑写在下面,请高手分析一下!)
表1 图书(标准图书编号(主键),出版社标识,书名,图书类别,内容提要,图书价格,图书折扣,图书购入日期,图书购入数量,图书出版出版日期,图书封面)
表2 图书与作家(标准图书编号,作家标识),主键是(标准图书编号,作家标识)
表3 作家(作家标识(主键),姓名)
表4 出版社(出版社标识(主键),出版社名称)
表5 销售记录(交易标识(主键),销售时间,标准图书编号,销售数量,客房标识)
表6 客户(客户标识(主键),客户名称,客户地址,客户所在城市,客户邮政编码,客户电话号码)
问题1:我在程序中有一个界面,是录入出版社标识和出版社名称(表4),想建立一个触发器,使表1添加一个新的出版社标识的记录,这样是否会在表1中添加一个除了有出版社标识外其他都为空的记录呢?,而在定义表1时,字段都不能为空,这样就会出错!,但是怎样让表1知道已经录入了新的出版社标识呢?
问题2: 感觉在录入数据时要把所有的表都放在一个程序界面中才不会出现关联错误(当然是错误的!)
我的错误思路是这样的! 如果表1中添加了新的标准图书编号的话,那么表2必然要插入一条记录,记录下新的标准图书编号,同时表5也应该插入一条新的记录也记录下新的标准图书编号,而表2和表5其他的字段不能为空啊!那么表2就把表3带上,表5就把表6带上,如此下去就把要把所有的表放在一个程序界面上录入,这当然是错误的!请高手指出错误所在!!
请高手说一下上述表中应该建立几个怎样的触发器来维护相关表的完整性,说一下用途就可以了,不必写出代码的!
上述概念非常重要,如果能够得到解决的话,无疑会解开长久的困惑!期待中!
...全文
45 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myclife 2002-05-18
1.给表1字段设置默认值。
2.必要的地方设置默认值,当然输入的数据可以在表之间传递。
建议:维护记录时从基础开始,先维护字典型的表(作家表,图书表,客户表)在维护业务表。。
回复
okcai 2002-05-18

对表2 同样
create trigger ....on 表2 for insert
as
begin tran
if 插入的.作家标识 not in 表3
then insert into 表3 插入的.作家标识 //或者你所要的处理
if 插入的.标准图书编号 not in 表1
then insert into 表1 插入的.标准图书编号 //或者你所要的处理
insert into 表2
commit
表五同样处理
回复
okcai 2002-05-18
你的思路确实有些麻烦。呵呵。
第一种办法:我想用外键还是可以实现的。很简单的就可以。
如果你要插入,只要你按顺序在同一个事务中提交,先插主表,在插从表,
可以考虑在存储过程中完成。如果主表已经有就不插入,如果没有才插入。
如果要删除:先删除从表,再删除主表。或者做级联删除。
第二种办法:不建外键。用触发器或者直接在程序中判断。
1、对表4(出版社),表6 客户,表3 作家的单独录入因为没有关联,可以不用管,直接做个录入界面直接往里面放就可以。根本就不用通知什么表1让他知道。
你在界面上让他用下拉框选择就可以了。
2、对表1 图书,
create trigger ....on 表1 for insert
as
begin tran
if 插入的.出版社标识 not in 表4
then insert into 表4 插入的.出版社标识 //或者你所要的处理
insert into 表1
insert into 表2
commit
对表2 同样
create trigger ....on 表1 for insert
as
begin tran
if 插入的.作家标识 not in 表3
then insert into 表3 插入的.作家标识 //或者你所要的处理
if 插入的.标准图书编号 not in 表1
then insert into 表1 插入的.标准图书编号 //或者你所要的处理
insert into 表2
commit
表五同样处理
回复
相关推荐
发帖
数据库相关
创建于2007-09-28

734

社区成员

PowerBuilder 数据库相关
申请成为版主
帖子事件
创建了帖子
2002-05-18 12:24
社区公告
暂无公告