表連線時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 在delete、insert、update 時,page的變化MySqldelete
- Sqlserver update\delete用inner join關聯,會update\delete關鍵字後面的表關聯到的行SQLServerdelete
- mssql sqlserver update delete表別名用法簡介SQLServerdelete
- 單表的更新UPDATE和刪除記錄DELETE(二十六)delete
- sql server 帶有OUTPUT的INSERT,DELETE,UPDATESQLServerdelete
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- ORACLE RAC叢集大範圍delete大表與insert&update同時執行導致活動會話數飆升Oracledelete會話
- DBeaver如何生成select,update,delete,insert語句delete
- MySQL資料災難挽救之Delete\UpdateMySqldelete
- 線性表中的單向連結串列的簡單操作
- Sqlserver、oracle中Merge的使用方法,一個merge語句搞定多個Insert,Update,Delete操作SQLServerOracledelete
- MybatisPlus中的update操作MyBatis
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 表的連線是指在一個SQL語句中通過表與表之間的關連SQL
- SQL Server的Merge —— 一步實現 insert,update,deleteSQLServerdelete
- update-alternatives符號連線的層數過多符號
- 利用insert,update和delete注入獲取資料delete
- KunlunDB功能之insert/update/delete...returning語句delete
- 線性表的基本操作
- windows系統下實現Redis的配置與連線操作WindowsRedis
- VNC,VNC連線操作!VNC
- DBA ORACLE連線操作Oracle
- 比CRUD多一點兒(三):UPDATE、DELETE語句delete
- 輕量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 語句ORMSQLdelete
- Hive學習筆記 ---- 支援Update和Delete以及MergeHive筆記delete
- Django之ORM連表操作DjangoORM
- 如何將報表與Lazarus中FastReport的資料連線?AST
- Thinkphp 3.2.3 parseWhere設計缺陷導致update/delete注入 分析PHPdelete
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- golang連線MySQL時候的連線池設定GolangMySql
- ABAP 740的新語法 - 使用BO association的方式進行內表連線操作
- 表連線型別型別
- ActiveRecord發update請求的原子操作
- vnc遠端連線linux,vnc遠端連線linux的具體操作VNCLinux
- JS物件操作(in、instanceof、delete)運算子JS物件delete
- Postgresql驗證_update、delete產生死亡元組,標準vacuum釋放表檔案磁碟空間的場景SQLdelete
- ES(Elastic Search)update操作設定無 docment時進行insertAST
- MySQL資料庫delete資料時,不支援表別名MySql資料庫delete
- 使用數字萬用表來檢測電子元器件的時候需注意的幾點