oracle多表關聯刪除的兩種方法


修改了上次的文章,網上的朋友對這篇博文提了意見,非常中肯,雖然上次是轉載,但是我也為我的不專業表示歉意。
這次是原創,所有內容均已經重寫,並驗證通過。

先刪除兩個測試表,p_DropTable是一個判斷表是否存在的存儲過程,如果存在則刪除,不存在則跳過。
CALL p_DropTable('T_DB');
CALL p_DropTable('T_DESC');

-- 創建T_DB表,保存數據庫名稱及所屬公司信息
CREATE TABLE T_DB AS
SELECT FID,FPNAME,FCO FROM
(
  SELECT  0 FID,'' FPNAME,'' FCO                     FROM DUAL UNION ALL
  SELECT  1,'ORACLE',       'ORACLE'                 FROM DUAL UNION ALL
  SELECT  2,'MySQL',        'ORACLE'                 FROM DUAL UNION ALL
  SELECT  3,'PostgreSQL',   'UC Berkeley'            FROM DUAL UNION ALL
  SELECT  4,'SQL SERVER',   'Microsoft'              FROM DUAL UNION ALL
  SELECT  5,'MongoDB',      'MongoDB'                FROM DUAL UNION ALL
  SELECT  6,'Redis',        'Redis'                  FROM DUAL UNION ALL
  SELECT  7,'Elasticsearch','Elasticsearch'          FROM DUAL UNION ALL
  SELECT  8,'Neo4j',        'Neo4j'                  FROM DUAL UNION ALL
  SELECT  9,'Cassandra',    'Cassandra'              FROM DUAL UNION ALL
  SELECT 10,'SQLite',       'D. Richard Hipp'        FROM DUAL UNION ALL
  SELECT 11,'OceanBase',    'OceanBase'              FROM DUAL UNION ALL
  SELECT 12,'DB2',          'IBM'                    FROM DUAL UNION ALL
  SELECT 13,'SYBASE',       'SYBASE'                 FROM DUAL UNION ALL
  SELECT 14,'Informix',     'IBM'                    FROM DUAL UNION ALL
  SELECT 15,'ACCESS',       'Microsoft'              FROM DUAL UNION ALL
  SELECT 16,'FoxPro',       'Microsoft'              FROM DUAL
);
-- 創建T_DESC表,保存數據庫的描述內容
CREATE TABLE T_DESC AS
SELECT FID,FDESC FROM
(
  SELECT  0 FID,'' FDESC                                        FROM DUAL UNION ALL
  SELECT  1,'占有率最高的數據庫'                                FROM DUAL UNION ALL
  SELECT  2,'最流行的開源數據庫'                                FROM DUAL UNION ALL
  SELECT  3,'功能最強大的開源數據庫'                            FROM DUAL UNION ALL
  SELECT  4,'Windows上最好的數據庫'                             FROM DUAL UNION ALL
  SELECT  5,'最好的基於分布式文件存儲的文檔型數據庫'            FROM DUAL UNION ALL
  SELECT  6,'最好的開源的緩存數據庫'                            FROM DUAL UNION ALL
  SELECT  7,'最好的搜索服務'                                    FROM DUAL UNION ALL
  SELECT  8,'最好的圖數據庫'                                    FROM DUAL UNION ALL
  SELECT  9,'最好的列式數據庫'                                  FROM DUAL UNION ALL
  SELECT 10,'最流行的開源的嵌入式數據庫'                        FROM DUAL UNION ALL
  SELECT 11,'最有潛力的支持海量數據的高性能分布式關系型數據庫'  FROM DUAL UNION ALL
  SELECT 12,'主要應用於大型應用系統'                            FROM DUAL UNION ALL
  SELECT 13,'它是基於客戶服務器體系結構的數據庫'                FROM DUAL UNION ALL
  SELECT 14,'IBM在線事務處理OLTP旗艦級數據服務系統'             FROM DUAL UNION ALL
  SELECT 15,'基於OFFICE的小型數據庫'                            FROM DUAL UNION ALL
  SELECT 16,'基於xBase類的語言的小型數據庫'                     FROM DUAL
);

SELECT * FROM T_DB;
SELECT * FROM T_DESC;

希望通過多表關聯的方法,刪除FID=0的記錄,
方法一:

為了防止操作錯誤,先查詢要刪除的數據
SELECT * FROM T_DB WHERE EXISTS
(
  SELECT 1
  FROM T_DESC
  WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0
);
使用EXISTS的方法刪除:這里沒有commit,防止刪除后不能恢復。
DELETE FROM T_DB WHERE EXISTS
(
  SELECT 1
  FROM T_DESC
  WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0
);

方法二:使用隱藏表的方法刪除
這種方法只適合兩個表都有主鍵或外鍵的時候,若是關聯一個管道函數就無法刪除成功,會提示錯誤
所以,首先建立表的關鍵字
Alter Table T_DB Add Constraint T_DBKey Primary Key (FID) Using index;
Alter Table T_DESC Add Constraint T_DESCKey Primary Key (FID) Using index;

為了防止操作錯誤,先查詢要刪除的數據
SELECT * FROM
(
  SELECT T_DB.*
  FROM T_DB,T_DESC
  WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0
);

DELETE FROM
(
  SELECT T_DB.*
  FROM T_DB,T_DESC
  WHERE T_DB.FID = T_DESC.FID AND T_DESC.FID = 0
);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM