12
返回列表 发新帖
楼主: 衣风

[精华] 急!!怎样对主从表进行记录的修改和删除

[复制链接]
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
11#
发表于 2004-12-1 19:51 | 只看该作者
好啊

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
12#
发表于 2005-12-22 22:08 | 只看该作者
级联更新中那个 DEFERRABLE 是最最关键的!!

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
13#
发表于 2005-12-23 00:48 | 只看该作者
但要注意,对主表的update必须是只应用到单条记录的update,否则很可能会出现从表记录的错误更新操作。
其实,非常非常不推荐级联更新,oracle根本不提供这种功能就表明,这种设计根本就是错误的!主键不应该被更新,如果你的主键必须被更新,那么,请使用另外一个字段比如序列号做主键。

使用道具 举报

回复
论坛徽章:
2
2014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
14#
发表于 2005-12-23 08:19 | 只看该作者
最初由 Laurence.li 发布
[B]但要注意,对主表的update必须是只应用到单条记录的update,否则很可能会出现从表记录的错误更新操作。
其实,非常非常不推荐级联更新,oracle根本不提供这种功能就表明,这种设计根本就是错误的!主键不应该被更新,如果你的主键必须被更新,那么,请使用另外一个字段比如序列号做主键。 [/B]


非常非常不推荐级联更新[/COLOR]
非常同意樓上的!

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2006-02-18 01:02:33会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
15#
发表于 2005-12-23 08:51 | 只看该作者
最初由 Laurence.li 发布
[B]但要注意,对主表的update必须是只应用到单条记录的update,否则很可能会出现从表记录的错误更新操作。
其实,非常非常不推荐级联更新,oracle根本不提供这种功能就表明,这种设计根本就是错误的!主键不应该被更新,如果你的主键必须被更新,那么,请使用另外一个字段比如序列号做主键。 [/B]


但是的确有极个别时候会需要更新主键,以往都不用DEFERRABLE
遇到这种问题,都是先禁用外键,在一个事务里面修改主、从表,然后启用外键。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-03-20 11:00:17
16#
发表于 2006-2-19 08:48 | 只看该作者
为什么我的实验结果是这样呢?
我没有使用deferable,结果也可以级连更新?请各位DX指点,谢谢!!!

SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 2月 19 07:17:50 2006

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn scott/tiger
SQL> create table parent(a int primary key);

表已创建。
SQL> create table son(id int,a  references parent(a));

表已创建。

SQL>
SQL> insert into parent
  2  select level from dual connect by level < 5;

已创建4行。

SQL> insert into son values(1,1);

已创建 1 行。

SQL> insert into son values(2,2)
  2  ;

已创建 1 行。

SQL> insert into son values(3,3);

已创建 1 行。

SQL> insert into son values(4,4);

已创建 1 行。

SQL> insert into son values(5,4);

已创建 1 行。

SQL> commit;

提交完成。

SQL> set wrap off
SQL> set linesize 200
SQL> select * from parent;

         A
----------
         1
         2
         3
         4

SQL> select * from son;

        ID          A
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          4

SQL> create or replace trigger tri_par
  2  after update on parent
  3  for each row
  4  begin
  5  update son set a = :new.a where a=ld.a;
  6  end;
  7  /

触发器已创建

SQL> update parent set a = 5 where a = 1;

已更新 1 行。

SQL> select * from parent;

         A
----------
         5
         2
         3
         4

SQL> select * from son;

        ID          A
---------- ----------
         1          5
         2          2
         3          3
         4          4
         5          4

SQL> rollback;

回退已完成。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-03-20 11:00:17
17#
发表于 2006-2-19 13:21 | 只看该作者
引用一段tom的回答
地址在:
http://asktom.oracle.com/pls/ask ... 65239682#PAGEBOTTOM

July 17, 2003
Reviewer:  parag

Thanks TOM for helping us by excellent logical answers.

Once again a query to ask you!!!!

if deferrable constraints by default
initially immediate it means constraint has to execute at the end of the
statement execution then how deferrable constraint is working in inserting of
"child parent records"
in a transaction ?  

( bcoz in child parent insert we want deferrable constraints to be checked only
at commit i.e transaction ends it means in such situations we have to specially
set deferrable constraints initially deferred when we have to insert child -
parent insert correct ?)

thx

Followup:  
[B]a deferrable constraint that is initially immediate works NO DIFFERENTLY then a
non-deferrable constraint.
[/B]

If you want to check at the end of the transaction, instead of statement you
would either

a) set constraint all | constraint_name deferred
b) create them initially deferred.


因此是否使用deferable效果应该是相同的吧?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表