CREATE OR REPLACE TRIGGER TR_UPT_RXKSZF
AFTER UPDATE ON TABLE_A
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
UPDATE TABLE_B
SET RXKSZF = RXKSZF + :NEW.KSCJ00
WHERE ZKZH00 = :NEW.ZKZH00;
END;
AFTER UPDATE ON TABLE_A
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
UPDATE TABLE_B
SET RXKSZF = RXKSZF + :NEW.KSCJ00
WHERE ZKZH00 = :NEW.ZKZH00;
END;
BEFORE INSERT ON 表a
FOR EACH ROW
BEGIN
UPDATE 表b SET
NUM=NUM+:new.result,
WHERE
准考证号=:new.准考证号;
end;
触发器没有提示错误,但也没有完成表B的更新.;(
to greatplain(蓝屏),
能解释一下这句吗:
REFERENCING OLD AS OLD NEW AS NEW,
多谢各位关注.各位能否解释下触发器中NEW和OLD的用处.有时候我觉得两个都通用.虽然肯定是错的.
1、你是每登记一门成绩,就计算总成绩?是因为每个考生的各科成绩不是同一时间“出来”?
2、你累加的单科成绩是A表同一字段,难道对各考生的单科成绩只保留最后登记的?
3、你是对A表的什么操作进行监控的?
4、希望你提供A表的表结构?
不管是什么情况,本人建议使用如下的解决方案(假定考生的数量是有增加的,即A表有新记录添加):
(1)只需设计一个A表,表结构为准考证号、成绩1、成绩2......,总成绩。要求:对于成绩字段,将空值默认为0,然后监控A表,如果有新记录插入操作或各成绩字段更新操作,则
update TABLE_A
set 总成绩=(:New.成绩1+:New.成绩2+......+:New.成绩n)
where 准考证号=:New.准考证号
(2)如果必须设计2个表,则设计A表为准考证号、成绩1、成绩2......,B表为准考证号、总成绩,其余要求同上,则
if inserting then
insert into TABLE_B(准考证号,总成绩)
VALUES(:New.准考证号,:New.成绩1+:New.成绩2+......+:New.成绩n)
end if
if updateing then
update TABLE_B
set 总成绩=(:New.成绩1+:New.成绩2+......+:New.成绩n)
where 准考证号=:Old.准考证号
end if
以上语句我只写了关键部分,其余的你自己可以补齐,还有语法部分再订正一下。这样做,我个人觉得思路比较清晰、正确率高,而且比较灵活。
以上仅供参考,祝你早日解决问题。
1:我在每登记一门单科成绩的时候就统计总分是想可以不需要在其他地方来触发统计总分的事件.而且如果用户修改更新了某个考生的成绩,可以立刻反应到表B中.
2:累加的单科成绩在表A中不是同一字段,是因为不同专业的考生其考试科目以及考试科目的数量是不同的.每个考生每科成绩都在A中有一条记录.(A表结构见下)
3:这个问题不太明白,是问触发器在什么时候表A的什么操作下触发的吗?如果是的话,那就是对表A的INSERT或者UPDATE进行操作.
4:表A的结构:
Create table xs_rxcjdj/*入学考试成绩登记*/(
XXZXBH CHAR(2),/*学习中心编号*/
XXZXMC CHAR(18),/*学习中心名称*/
XN0000 CHAR(4),/*学年*/
JB0000 CHAR(1),/*季别:0-春,1-秋*/
BMH000 CHAR(12),/*报名号*/
ZKZH00 CHAR(12),/*准考证号*/
XXLBBH CHAR(1) ,/*学习类别编号:专升本-1,高起本-2,研究生课程班-3,委培专升本-4等*/
XXLBMC CHAR(30),/*学习类别名称*/
XM0000 CHAR(10),/*姓名*/
XB0000 CHAR(1),/*性别*/
ZYBH00 CHAR(2),/*专业编号*/
ZYMC00 VARCHAR2(30),/*专业名称*/
KSKCMC CHAR(30),/*考试课程名称*/
KSKCBH CHAR(4),/*考试课程编号*/
KSCJ00 NUMBER(5,2),/*考试成绩*/
LRY000 CHAR(10),
LRSJ00 CHAR(12)
);我会好好研究一下你的回复.
接触数据库还不久,因此在结构优化上可以考虑的不是太多.非常感谢的你关注.希望能得到你的回复.
如果依你对A表的设计,我觉得:
第一、造成数据戎余,而且也会给你自己增加工作量;
第二、你将如何计算总分?依你的算法(总成绩=总成绩+考试成绩),每增加一门成绩、或修改一门成绩,总成绩都会在原基础上累加,对于新增加的考试成绩这样算是对的,但是对于修改是不是有问题?你仔细想一想,被修改的考试成绩在它最初添加的时候已经被累加了,而之后每次被修改你未做任何修改就累加到总成绩里,是否重复累加了呢?
好,现在按你原先的设计,我给你建议一个解决方案:
数据库按你原先的设计,对表A见空的Insert和updata操作实行监控,算法如下:
if inserting then
updata Table_B
set 总成绩=总成绩+:New.考试成绩
where 准考证号=:New.准考证号
end if
if updatating then
updata Table_B
set 总成绩=总成绩-Old.考试成绩+:New.考试成绩
where 准考证号=:Old.准考证号
end if
这里需要提出的疑问是,B表中数据如何产生?如果是自动产生,即A表中新增加一名学生(对应到表结构,就是准考证号字段),则B表中自动添加相应记录,那么在上述算法中就要添加如下几句:
定义变量:
Pzkzh 与字段准考证号变量类型相同
if inserting then
select 准考证号 into Pzkzh from Table_B where 准考证号=:New.准考证号
if Pzkzh=:New.准考证号 then
updata Table_B
set 总成绩=总成绩+:New.考试成绩
where 准考证号=:New.准考证号
else
insert into Table_B(准考证号,总成绩)
value(:New.考试成绩,:New.考试成绩)
end if
end if
if updatating then
updata Table_B
set 总成绩=总成绩-Old.考试成绩+:New.考试成绩
where 准考证号=:Old.准考证号
end if
还是那句话,语法部分自己再订正一下。
--------------------------------------------------------------------
如果我的建议,能够帮助到你,我将感到无比的开心。希望以后大家能够多互相帮助、多交流,共进步!*^_^*
Pzkzh 与B表中准考证号字段变量类型相同 if inserting then
select 准考证号 into Pzkzh
from Table_B
where 准考证号=:New.准考证号
if Pzkzh=:New.准考证号 then
updata Table_B
set 总成绩=总成绩+:New.考试成绩
where 准考证号=:New.准考证号
else
insert into Table_B(准考证号,总成绩)
values(:New.准考证号,:New.考试成绩)
end if
end if
if updatating then
updata Table_B
set 总成绩=总成绩-:Old.考试成绩+:New.考试成绩
where 准考证号=:Old.准考证号
end if
对于数据冗余,还望多指教指教.因为表A中还包含了学生的报名信息,如果不把成绩以其分开,好像会造成更多的冗余.而且(科目)成绩的字段数量也无法确定.
如果表A增加一条数据,在登记成绩的时候,将按专业取得考试的课程(假设该有5科考试课程),则每个学生生成5条记录.在这里确实会造成数据的冗余,但对于不同专业可能有不同数目的考试课程,如果每个学生生成一条记录,在一条记录里登记X个考试课程的成绩的话,要怎么处理数据结构呢?
谢谢关注,希望共同进步!
1)我们曾做过一个实验,增加冗余字段和冗余记录之间,哪一个更占空间,结果是,增加冗余字段;
2)但是,上述是在有大量冗余字段的情况下,才选择增加冗余记录,或者最好的方法是增加一个关联表;
3)针对你目前的这个需求,可以采取增加一个关联表的方法,但我个人觉得,这里每个考生的考试科目门数最多超不过5门,你可以这样设计A表(考试科目及成绩部分):KSKCMC1,KSKCBH1,KSCJ001,KSKCMC2,KSKCBH2,KSCJ002,......,KSKCMC5,KSKCBH5,KSCJ005,对KSCJ00(考试成绩)设置默认值为0,以便后面总成绩计算的简便。这样,考试课程名称、考试课程编号和考试成绩之间有了对应关系,对于少于5门的考生,比如只有3门,则该生的第4、5门的考试课程名称、考试课程编号为空、考试成绩为0;而触发器的写法参考我第一次给你的算法。
Ok,加油,祝你早日解决问题。*^_^*
领教了.每次开发是写数据结构总要左思右想,到了写程序的时候发现还是右需要更改的地方.以后还望多多指教.
下次碰到类似的情况,我会好好斟酌在建表.现在我采用原来的结构,已经完成了总成绩更新的问题(主要是相关的代码已经完工,结构一改,代码也要更改了.)
下面是俺的触发器,采用你上面提到的第二种算法.由于在表A一定有相对应的准考证的记录,因此如果是表B插入新记录,就直接更新表A的相关连的记录.
---
CREATE TRIGGER TR_UPT_RXKSZF
AFTER INSERT OR UPDATE OF 成绩 ON TABLE_B
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE Table_a
SET 总分=总分+ :NEW.成绩
WHERE 准考证号=:NEW.准考证号;
END IF;IF UPDATING THEN
UPDATE Table_a
SET 总分=总分- :OLD.成绩+ :NEW.成绩
WHERE 准考证号=:OLD.准考证号;
END IF;
END;
---
再次感谢您的帮忙!