<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    ??? 最近學(xué)到update的另一種寫法,是以前自己從來沒有使用過的,看了一下文檔,也沒有找到很詳細(xì)的說明。這種update方式其基礎(chǔ)是建立在Query中的,所以可以確保使用CBO而非RBO,可以在大表的更新時明顯得提高效率。在這里記錄一下基本的方法:
    ?
    ?
    SQL> create table a ( id int, a1 varchar2(25) );
    SQL> create table b ( id int, b1 varchar2(25) );
    SQL> insert into a values ( 1, 'Hello' );
    SQL>?insert into a values ( 2, 'xxxxx' );
    SQL> insert into b values ( 2, 'World' );
    SQL> commit;
    ?
    ?
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2??set a1 = b1;
    set a1 = b1
    ??? *
    ERROR at line 2:
    ORA-01779: cannot modify a column which maps to a non key-preserved table
    ?
    --無法Update,必須要有一個主鍵
    ?
    SQL> alter table b add constraint b_key primary key(id);
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2??set a1 = b1;

    1 row updated.
    ?
    --可以Update
    ?
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2??set b1 = a1;
    set b1 = a1
    ??? *
    ERROR at line 2:
    ORA-01779: cannot modify a column which maps to a non key-preserved table
    ?
    --交換位置后依舊無法更新
    ?
    SQL> alter table b drop constraint b_key;
    SQL> alter table a add constraint a_key primary key(id);
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2??set b1 = a1;

    1 row updated.
    ?
    --為表a設(shè)置主鍵后可以更新
    ?
    SQL> alter table a drop constraint a_key;
    SQL> alter table a add constraint a_key primary key(id,a1);
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2? set b1 = a1;
    set b1 = a1
    ??? *
    ERROR at line 2:
    ORA-01779: cannot modify a column which maps to a non key-preserved table
    ?
    --使用聯(lián)合主鍵也是不可以的,必須是關(guān)聯(lián)字段
    ?
    ?
    ??? 由上可知,使用這種方式來更新表,需要用于更新的表(最終數(shù)據(jù)表)的關(guān)聯(lián)字段必須設(shè)置為主鍵,且不可多字段主鍵。另外還有一個網(wǎng)友也指出了另外一個問題:
    If the user has update permission on table A, but only has select permission on table B, they cannot update via the first example.? Oracle will return ORA-01031 (insufficient privileges).
    ?
    ??? 測試一下:
    ?
    SQL> create user?x identified by x;
    SQL> grant create session on x;
    SQL> grant select,update on a to x;
    SQL> grant select on b to x;
    SQL> create public synonym a for wangxiaoqi.a;
    SQL> create public synonym b for wangxiaoqi.b;
    ?
    SQL> conn?x/x
    Connected.
    SQL> update ( select a1, b1 from a, b where a.id = b.id )
    ? 2? set a1 = b1;
    update ( select a1, b1 from a, b where a.id = b.id )
    ?????????????????????????????? *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    ?
    --系統(tǒng)報(bào)錯權(quán)限不夠
    ?
    SQL> update a set a1 = (select b1 from b where b.id=a.id);
    ?
    2 rows updated.
    ?
    --使用Update...Select...語句是可以更新成功的
    ?
    ?
    ?
    ?
    ?




    -The End-

    posted on 2009-04-06 21:51 decode360-3 閱讀(1435) 評論(2)  編輯  收藏 所屬分類: Oracle

    評論

    # re: Update的另一種寫法[未登錄] 2009-10-14 10:57 阿牛
    ^@^Oracle確實(shí)強(qiáng)大,這種update看似簡單,其實(shí)處理蠻麻煩的  回復(fù)  更多評論
      

    # re: Update的另一種寫法 2010-09-07 15:51 kruce lee
    @阿牛
    modifying a join view....  回復(fù)  更多評論
      

    主站蜘蛛池模板: 国内成人精品亚洲日本语音| 成人免费a级毛片无码网站入口| 成av免费大片黄在线观看| 日本一区二区三区免费高清在线| 亚洲a∨无码精品色午夜| 亚洲爆乳无码精品AAA片蜜桃| 亚洲人成电影网站久久| wwwxxx亚洲| 亚洲国产区男人本色| 亚洲AV香蕉一区区二区三区| 精品亚洲av无码一区二区柚蜜| 337P日本欧洲亚洲大胆艺术图| 毛片亚洲AV无码精品国产午夜| 亚洲AV香蕉一区区二区三区| 曰批免费视频播放在线看片二| 农村寡妇一级毛片免费看视频| 一级毛片免费在线播放| a级毛片高清免费视频就| 免费91最新地址永久入口 | 久久亚洲国产成人亚| 亚洲av无码一区二区三区网站| 亚洲图片一区二区| 亚洲妓女综合网99| 亚洲人片在线观看天堂无码| 最新亚洲人成网站在线观看| 一级毛片**免费看试看20分钟| 中文在线观看国语高清免费| 日本免费电影一区二区| 和日本免费不卡在线v| 国产精品二区三区免费播放心 | 亚洲成A人片77777国产| 亚洲人成色77777| 亚洲视频在线观看免费视频| 亚洲中文字幕久久精品无码A| 人妻无码中文字幕免费视频蜜桃 | 亚洲kkk4444在线观看| 成人午夜免费视频| 99久久国产免费-99久久国产免费| 免费一本色道久久一区| 亚洲国产综合精品一区在线播放| 久久伊人久久亚洲综合|