两表关联的触发器(50分)

  • 主题发起人 主题发起人 HeBaisong
  • 开始时间 开始时间
H

HeBaisong

Unregistered / Unconfirmed
GUEST, unregistred user!
1:两表关联问题

Table1的字段是Name1:varchar(9)
Addr :varchar(20)
Table2的字段是Name2:varchar(9)
Addr :varchar(20)
其中Table2的字段Name2必须是Table1的Name1的内容
建立这两个表以后对Table1和Table2的字段Name1和Name2进行修改
我建立Table2的时候
create table Table2
(Name2 varchar(9)
CONSTRAINT FK_Name_Table1 REFERENCES Table1(Name1),
Addr:varchar(20)
)
on primary
这样使Table2的Name2的内容限制在Table1的对应字段里
问题是:我对Table1或者Table2里的记录进行修改时,如果我修改Name1或者Name2,由于约束
使记录无法修改成功,我想请教各位,可否帮我给Table1写个update触发器,当Table1的字段
Name1有改动时,同时改动Table2的Name2

 
To : cAkk, 吴剑明
我的问题怎么没有人回答呀?还是把分还给我吧!
 
你应该为表加一个唯一标志字段,如iID。
如你的表应改为:
T1: T2:
iID name1 addr iID T1nameID addr
iID是主键。

其中 iID----T1nameID.
T1为主键表,T2为外键表。
这样的设计才是合理的,并且不会有你说的问题。
 
To guqs:其实我表理有,我只是截取了我表里的部分字段,我就是想通过触发器在Table1的
Name1改变时能自动把Table2中Name2的字段值为Table1.Name1的叶自动改过来
 
你可以用查找后再修改嘛
if table2.findkey('字段') then table2.name2.asstring;=name1;
 
To :浪里白条
这种方法我也想了,主要是我不想在程序中,想在SQL的触发器中自动的进行,不知道你
可不可以写一个给我,我看你发了很多的贴字,很厉害的
 
想问一个问题:
with ADOQuery do begin
close;
SQL.Clear;
SQL.Add('select Field1,Field2 from Table ');
SQL.Add(' compute Sum(Field1) ');
Prepared;
try
Open;
except
exit;
end;//end try
end;//end with
我现在想把ADOQuery 中的Compute sum(Field1)的结果付值给变量SQty,应该如何做?
 
你不应该使Name2直接应用Name1做外键,
而应该向我上面说的,用一个不可更改的标志ID,引用T1的ID,而T2里实际上没有name字段,
要显示T2的NAME时直接用连接表到T1中取name1,这样当T1的name1改动时,t2显示的name1自然随着
变化。
 
想问一个问题:
with ADOQuery do begin
close;
SQL.Clear;
SQL.Add('select Field1,Field2 from Table ');
SQL.Add(' compute sumField=Sum(Field1) '); //Ok
Prepared;
try
Open;
except
exit;
end;//end try
end;//end with
我现在想把ADOQuery 中的Compute sum(Field1)的结果付值给变量SQty,应该如何做?
SQty := ADOQuery.FieldByName('sumField').value;
 
To guqs:我想你的思路应该是对的,这样一来,我的表要大变动了,


To sundart:SQL.Add(' compute sumField=Sum(Field1) '); //Ok这一句好像有问题
我在 Query Analyzer中试了,这一句行不通



这两个问题解决了有150分送上,当然分不是主要的,重要的是我们能够互相提高
 
//SQL.Add(' compute sumField=Sum(Field1) '); //Ok这一句好像有问题
Sory,没仔细看, Compute语句后面是不能这样指定的。使用Compute将产生非标准行,
所以Query根本就不能返回这个值,所以一般最好不用。
你用Compute只是想得到一个字段的和而已,可能需要执行:
select sumfield1=sum(field1) from Table

关联表的“引用字段” 修改,用Update触发器是实现不了的,我折腾了半天,经证实
不行,因为在执行触发器之前已经出错了,给点分鼓励下吧 :)

所有你的程序只能在Delphi中去实现。
 
楼上的家伙真厉害!!
 
To sundart :
  我们需要的是提高,所以我想知道如何来引用compute Sum(Field1)的值,何况我
的select 语句中还有其它的字段,在gruop by 的时候得不到我所想要的结果
例如:select sum(Field1) ,Field1
from Table1
group by Field1
compute sum(Field1)
在上面的语句中,compute 语句中的 sum(Field1) 是 select sum(Field1)语句中所有
查询记录的和,也是我希望得到的结果
所以我用了compute 语句,不知道哪位还能想到更好的办法?在这先谢谢了。
 
想问一个问题:
with ADOQuery do begin
close;
SQL.Clear;
SQL.Add('select Field1,Field2 from Table ');
SQL.Add(' compute Sum(Field1) ');
Prepared;
try
Open;
except
exit;
end;//end try
end;//end with
我现在想把ADOQuery 中的Compute sum(Field1)的结果付值给变量SQty,应该如何做?
也就是说如何获得 compute Sum(Field1)的值,不用其他的方法获得Sum(Field1)得值

请guqs到我另外一个未答问题里去拿分
 
To guqs :本来想把另外一个问题的100分给你的,可惜我按错了,给了delphic了,气死我
了,下次补给你吧!不好意思!:(
 
建议不用COMPUTE,改用ROLLUP 或CUBE。
原因:
支持 COMPUTE 和 COMPUTE BY 是为了向后兼容。应优先选用 ROLLUP 而非 COMPUTE
或 COMPUTE BY。COMPUTE 或 COMPUTE BY 生成的汇总值作为分离的结果集返回,
这些结果集之间还插入了各组明细行结果集;或者作为包含合计的结果集返回,追加在主
结果集之后。处理这些多重结果集增加了应用程序代码的复杂性。
COMPUTE 和 COMPUTE BY 都不支持服务器游标,而 ROLLUP 则支持。
CUBE 和 ROLLUP 将生成单个结果集,其中包含嵌入的小计和合计行。
并且,有时查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE 和 COMPUTE BY 生成的更
为高效。
 
To guqs:我曾经试着用rollup 和 cube 这样增加了很多查询结果,所以我就没有用它了
不过在最后不行的情况下看来还只有用它了,可惜呀,那100分给错了,在公司吧?
 
正在公司。
看来我白跑去一趟。不过机会多多!
 
To guqs :不好意思!下次吧
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部