表連線時update與delete操作需注意的地方
一. 表連線的update測試
/*******************先看下面的測試******************/
SQL> drop table test1;
表已刪除。
SQL> drop table test;
表已刪除。
SQL> create table test(a number,b number,c number ,d varchar2(6));
表已建立。
SQL> insert into test values(1,1,1,'1');
已建立 1 行。
SQL> insert into test values(2,2,2,'2');
已建立 1 行。
SQL> insert into test values(3,3,3,'3');
已建立 1 行。
SQL> commit;
提交完成。
SQL> create table test1(a number,b number);
表已建立。
SQL> insert into test1 values(1,9);
已建立 1 行。
SQL> commit;
提交完成。
SQL> update (select a.a aa,a.b ab,b.a ba,b.b bb from test a,test b where a.a=b.a) set ab=bb;
update (select a.a aa,a.b ab,b.a ba,b.b bb from test a,test b where a.a=b.a) set ab=bb
*
第 1 行出現錯誤:
ORA-01779: 無法修改與非鍵值儲存表對應的列
/********給test表新增主鍵a列***************/
SQL> alter table test add primary key(a);
表已更改。
SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set ab=bb;
update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set ab=bb
*
第 1 行出現錯誤:
ORA-01779: 無法修改與非鍵值儲存表對應的列
提示:還是無法更新,因為更新的是test表,test表是根據test1表的a列來更新的,所以應該是給test1表的a列設定主鍵,下面換作更新test1表,只需將set ab=bb 改為 set bb=ab即可,如下:
SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set
2 bb=ab;
已更新 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 3
SQL> select * from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> select * from test1;
A B
---------- ----------
1 9
/*********新增test1表主鍵a列******************/
SQL> alter table test1 add primary key(a);
表已更改。
SQL> update(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a) set
2 ab=bb;
已更新 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
1 9 1 1
2 2 2 2
3 3 3 3
SQL> select * from test1;
A B
---------- ----------
1 9
SQL> rollback;
回退已完成。
SQL> spool off
二. 表連線的delete測試
SQL> select *from test;
A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew
SQL> select *from test1;
A B
---------- ----------
1 1
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where a.a=b.a);
已刪除 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew
SQL> select *from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> select *form test;
select *form test
*
第 1 行出現錯誤:
ORA-00923: 未找到要求的 FROM 關鍵字
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
已刪除 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew
SQL> select * from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> alter table test drop primary key;
表已更改。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
已刪除 1 行。
SQL> select *form test;
select *form test
*
第 1 行出現錯誤:
ORA-00923: 未找到要求的 FROM 關鍵字
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew
SQL> select * from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test1 b,test a where b.a=a.a);
已刪除 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew
SQL> select *from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> alter table test1 drop primary key;
表已更改。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a)
*
第 1 行出現錯誤:
ORA-01752: 不能從沒有一個鍵值儲存表的檢視中刪除
SQL> alter table test add primary key(a);
表已更改。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
已刪除 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew
SQL> select *from test1;
未選定行
SQL> rollback;
回退已完成。
SQL> alter table test1 add primary key(a);
表已更改。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test a,test1 b where b.a=a.a);
已刪除 1 行。
SQL> select *from test;
A B C D
---------- ---------- ---------- ------
2 2 2 2
3 3 3 wew
SQL> select *from test1;
A B
---------- ----------
1 1
SQL> rollback;
回退已完成。
SQL> delete(select a.a aa,a.b ab,b.a ba,b.b bb from test1 b,test a where b.a=a.a);
已刪除 1 行。
SQL> select * from test;
A B C D
---------- ---------- ---------- ------
1 1 1 1
2 2 2 2
3 3 3 wew
SQL> select * from test1;
未選定行
SQL> rollback;
回退已完成。
SQL> spool off;
總結:
1.當其中只有一個表有主鍵的時候
刪除沒有主鍵的表記錄
2.當兩個都有主鍵的時候
刪除表連線中非驅動表的那個表
比如通常的rule模式下from a,b : 就刪除a中的,如果是from b,a就刪除b中的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1020424/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 5.5 中自連線update and deleteMySqldelete
- delete與delete[]需要注意的地方delete
- Java程式設計提高效能時需注意的地方Java程式設計
- MySQL之資料的insert-delete-update操作MySqldelete
- RAC連線中TNSNAMES需注意的問題
- 利用Open Interface表對BOM、Substitute、Reference Designater 進行Create、Update、Delete操作delete
- Sqlserver update\delete用inner join關聯,會update\delete關鍵字後面的表關聯到的行SQLServerdelete
- mysql 在delete、insert、update 時,page的變化MySqldelete
- 限制訪問表的FOR UPDATE操作
- mssql sqlserver update delete表別名用法簡介SQLServerdelete
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle
- Oracle表連線操作——Hash Join(雜湊連線)上Oracle
- 恢復update,delete表資料錯誤的語句delete
- sqlserver update或者Delete誤操作恢復方法---【驗證】SQLServerdelete
- 【MySQL】ERROR 1175 安全模式UPDATE/DELETE操作失敗MySqlError模式delete
- LINQ to SQL語句之Insert/Update/Delete操作SQLdelete
- Oracle資料庫中Insert、Update、Delete操作速度Oracle資料庫delete
- 表與表之間連線式on,using以及自然連線的區別
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- 單表的更新UPDATE和刪除記錄DELETE(二十六)delete
- Delete,insert,update與undo的關係[轉載TOM文章]delete
- PHP同時操作多個MySQL連線PHPMySql
- delete 與全表掃描delete
- APPEND載入與DELETE操作APPdelete
- ORACLE表連線方式的分析與優化Oracle優化
- update,delete與INNER JOIN 以及刪除重複資料delete
- 檢視insert,delete,update對基表的影響(檢視初識)delete
- 時間管理與其他系統的連線
- 【SQL】表連線 --半連線SQL
- 線性表中的單向連結串列的簡單操作
- delete與高水位線HWM回收delete
- delete操作時遭遇ora-600 bug[kntgslm]delete
- Default Locking for INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE (351)delete
- 表的連線是指在一個SQL語句中通過表與表之間的關連SQL
- 臨時表的操作
- ORACLE RAC叢集大範圍delete大表與insert&update同時執行導致活動會話數飆升Oracledelete會話
- MySQL update資料時InnoDB內部的操作流程MySql
- Oracle的表連線方法(三)雜湊連線Oracle