修改了上次的文章,網上的朋友對這篇博文提了意見,非常中肯,雖然上次是轉載,但是我也為我的不專業表示歉意。
這次是原創,所有內容均已經重寫,並驗證通過。
先刪除兩個測試表,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 );