楼主: biti_rainy

[精华] 表连接的update,经典?

[复制链接]
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
21#
发表于 2002-7-31 14:15 | 只看该作者

问题还是出来了哦:

问题是这样的,rainy 说的如果两个表中都有主键,则删除
非驱动表中的行,但是我下面的应用却删除了驱动表中的
应用,这是怎么会事呢?应用在下面显示:

SQL> alter table test2 drop primary key;

Table altered

SQL> alter table test2 add primary key(record);

Table altered

SQL> alter table test1 drop primary key;

Table altered

SQL> alter table test1 add primary key(num);

Table altered

SQL> desc test1;
Name Type         Nullable Default Comments
---- ------------ -------- ------- --------
NUM  NUMBER                                 
NAME VARCHAR2(20) Y                        

SQL> desc test2;
Name   Type         Nullable Default Comments
------ ------------ -------- ------- --------
NUM    NUMBER       Y                        
NAME   VARCHAR2(20) Y                        
RECORD NUMBER                0               

SQL> select * from test1;

       NUM NAME
---------- --------------------
       701 zhangming
       702 chenhua
       704 penghui
       709 xiaojun
       721 likaixia

SQL> select * from test2;\

       NUM NAME                     RECORD
---------- -------------------- ----------
       701 zhangming                     1
       702 chenhua                       2
       704 pe454434i                     3
       709 xi455un                       4
       721 likaixia                      5
       704 penghui                       6
       709 xi32545un                     7
       721 likaixia                      8

8 rows selected

SQL> delete (select a.num a1,a.name a2,b.num b1,b.name b2,b.record b3 from test1 a,test2 b where b.num = a.num)where b1 = 704;

2 rows deleted

SQL> select * from test1;

       NUM NAME
---------- --------------------
       701 zhangming
       702 chenhua
       704 penghui
       709 xiaojun
       721 likaixia

SQL> select * from test2;

       NUM NAME                     RECORD
---------- -------------------- ----------
       701 zhangming                     1
       702 chenhua                       2
       709 xi455un                       4
       721 likaixia                      5
       709 xi32545un                     7
       721 likaixia                      8

6 rows selected

SQL>

其中test2中NUM=704的两行被delete掉了哦!这可不是
我们所期望的呀!

大家看看问题出现在什么地方?

使用道具 举报

回复
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
22#
发表于 2002-7-31 14:27 | 只看该作者
最初由 violet 发布
[B]"当其中只有一个表有主键的时候
删除没有主键的表记录

当两个都有主键的时候
删除表连接中非驱动表的那个表
比如通常的rule模式下from a,b : 就删除a中的"


是删除没有主键的表记录,
<B>但当两个都有主键时,为什么我做的时候会报错呀?</B>


"主要是考虑到大表需要更新或者删除的时候
正好又要表连接为条件
因为在sybase数据库中是有这种功能的
很多人抱怨oracle没有这种功能
于是只能通过嵌套来解决
我希望这样效率能高一点"

今天正好用上了,真的快多了!
sybase 在这方面确实灵活多了,可是它没有集合运算. [/B]


两个表都有主键的话,有时候会报错ora-1752错误:

ORA-01752: 不能从没有一个键值保存表的视图中删除

有时候就不会,我上面的例子中就没有报错,但曾经也有过
报错的时候,比较奇怪!!!  :)   

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
23#
 楼主| 发表于 2002-7-31 14:35 | 只看该作者

我的关于 驱动表 的说法

我不敢保证是否正确
因为,本来我想利用  sql_trace 追踪并用 tkprof查看的
因为 就算  set  autotrace on 的结果也未必是正确的

只可以,我机器上居然没有  tkprof,真郁闷

我想看到底是删除哪个表,是否有比较可靠的依据
有兴趣你可以做频繁实验找出规律来

使用道具 举报

回复
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
24#
发表于 2002-7-31 14:56 | 只看该作者

Re: 我的关于 驱动表 的说法

最初由 biti_rainy 发布
[B]我不敢保证是否正确
因为,本来我想利用  sql_trace 追踪并用 tkprof查看的
因为 就算  set  autotrace on 的结果也未必是正确的

只可以,我机器上居然没有  tkprof,真郁闷

我想看到底是删除哪个表,是否有比较可靠的依据
有兴趣你可以做频繁实验找出规律来 [/B]


rainy大哥,我已经搞了两天了,我改到这一步:
把where子句中的字段分别定义成各个表的主键,然后再做
delete,结果还是比较失望……  :(


你说的sql_trace我没有用过哦,不好意思,tkprof 还没有听说
过了哦,怎么做追踪测试呢?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
25#
 楼主| 发表于 2002-7-31 15:19 | 只看该作者

sql_trace 追踪并用 tkprof查看

tuning 部分的内容
追踪sql的实际执行计划和详细的资源消耗等状况

慢慢一步一步来吧  

使用道具 举报

回复
论坛徽章:
4
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-05-19 12:39:15行业板块每日发贴之星
日期:2006-11-17 01:08:18
26#
发表于 2002-7-31 15:26 | 只看该作者

Re: sql_trace 追踪并用 tkprof查看

最初由 biti_rainy 发布
[B]tuning 部分的内容
追踪sql的实际执行计划和详细的资源消耗等状况

慢慢一步一步来吧   [/B]


tkprof在那里找到,我使用的环境是ora8。1。7 plsql语言

我找到了sql trace,但是没有看到tkprof哦! :)

再次请教rainy 大哥哦!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
27#
发表于 2002-7-31 15:51 | 只看该作者

9i 的规则改变了

Oracle9i Database README Release Notes
26.0 MATERIALIZED VIEWS
26.1 Updating a Join View
The delete rules for updatable join views have been changed in Oracle9i. It is now possible to delete from an updatable join view when the join view contains more than one key-preserved tables. In this case, Oracle9i uses the first table appearing in the from clause of the updatable join view as the target of the delete operation.

For example:

delete from
  (select rowid
   from orders o, okey ok
   where o.orderkey = ok.orderkey);

If both tables are key-preserved (that is, a unique index exists on the orderkey column for both tables), Oracle9i will resolve the ambiguity by assuming that the target of the delete operation is the table order, as it appears first in the from clause of the updatable join view. The same rule also applies to updatable join views using the WITH CHECK OPTION clause.

For more information on updatable join views and key-preserved tables, please refer to section "Managing Views, Sequences and Synonyms" in the Oracle9i Database Administrator's Guide.

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2002-10-29 11:06 | 只看该作者
但是我的col2是含有空值的,无法建立主键。

使用道具 举报

回复
论坛徽章:
0
29#
发表于 2003-11-3 16:10 | 只看该作者
不可以用exists么??

想删的表放到delete 后面,其他做条件:

delete a where exists ( select rowid from b where a.xx = b.xx )

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
30#
发表于 2003-11-16 09:02 | 只看该作者
最初由 xiexudong 发布
[B]但是我的col2是含有空值的,无法建立主键。 [/B]

ROWID 应该ORACLE的自然主键, 在没有主键的时候用ROWID来确定要修改的行, 不知道可行否

使用道具 举报

回复

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

本版积分规则 发表回复

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