複製鏈接
請複製以下鏈接發送給好友

數據刪除

鎖定
如果表格中存在錯誤或重複的數據,比較簡單、快捷的方法就是選定該數據,然後將其刪除。進行數據刪除時分為兩種:常用數據刪除的方法和偽列數據刪除的方法。
中文名
數據刪除
外文名
Data deletion
對    象
表中錯誤或重複的數據
簡單問題
直接使用DELETE語句
複雜問題
先分割再使用DELETE語句
應用學科
數據庫原理

數據刪除常用數據刪除方法

用DELETE語句刪除數據庫表中數據,當刪除的數據量不多時,可簡單地一次性刪除,但是當遇到數據量很大的情況系下,需要進行數據分割。可根據數據表自身特點按照字段特徵來進行分割,不同的數據表中有不同的字段就需要進行不同的分割,根據分割反覆進行DETELE刪除操作,否則就可能出現回滾段空間滿錯誤。 [1] 
Oracle數據庫有一個或多個回滾段。回滾段是數據庫的一部分,是一個存儲區域,數據庫使用該存儲區域存放更新的事物或刪除行的數據值。刪除的數據原值就存在回滾段,對於批量數據可以分配給較大的回滾段,但也是有限的。每個回滾段的塊只能包含一個事物的信息,當刪除的數據記錄達到一定的數量,膨脹到難以承受的程序就不能進行相應正常的工作了。 [1] 

數據刪除偽列數據刪除方法

該方法分兩步來實現。首先使用遊標技術收集滿足刪除條件記錄的ROWID值,其次根據已收集的ROWID集合,進行刪除操作。在刪除過程中一次刪除數據的記錄數可自定義。 [1] 

數據刪除偽列ROWID

Oracle數據庫中每個表中都有一個名為ROWID的偽列,是一個18字節[數據對象編號(6字節)+文件編號(3字節)+塊編號(6字節)+行編號(3字節)]的字符串,它允許使用保留字ROWID作為列名來訪問任意行的地址。ROWID偽列不存存儲在數據庫中,不佔用任何空間,也不能被修改或刪除。只要表格中存在某個行,就有對應該行的ROWID。由於ROWID具有唯一性,因此ROWID可看做是數據庫表中每一行唯一的關鍵字。 [1] 
利用偽列ROWID來實現批量數據刪除操作的,表結構為:
CREATE TABLE student


(
    
    
  NUM      VARCHAR2(10)      NOT NULL,
    

NAME     VARCHAR2(10)      NOT NULL,

  
  MAJOR     VARCHAR2(10)      NULL,

  
  BIRTHDAY   DATE          NULL,

  
  PRIMARY KEY(NUM)


)
假設表中插入了18條記錄,在PL/SQL環境執行下條語句:
SELETE ROWID FROM student
結果顯示為:
ROWID


AAAOBSAAEAAAmwQAAA


AAAOBSAAEAAAmwQAAB


AAAOBSAAEAAAmwQAAC


... ... ...


AAAOBSAAEAAAmwQAAR
用ROWID刪除這18條中的一些記錄,SQL語句如下:
DELETE student WHERE ROWID IN('AAAOBSAAEAAAmwQAAA','AAAOBSAAEAAAmwQAAB',...
)

數據刪除MFC ADO獲取記錄集

可在Visual C++中使用ADO訪問數據庫,並且自定義類CADOConn實現訪問操作。動態SQL語句可以通過參數傳給CADOConn::GetRecordSet函數獲取查詢結果,然後使用CADOConn::GetRecordCount函數獲得記錄數,再遍歷結果集,通過CADDOConn::GetCollect函數得到字段值。 [1] 
例如,從表student中檢索生日為“1991-07-17”的學生姓名name的值,並存放在變量strname中進行測試,代碼如下:
CString selstr="select * from tempstudent where birthday=to_date('1991-07-17','yyyy-mm-dd')";

Adoconn.GetRecordSet(selstr);

int Count = Adoconn.GetRecordCount();

CString name;

for(int j=0;j<Count;j++)

{
   
  Adoconn.GetCollect("name",name);
   
  Adoconn.m_pRecordset->MoveNext();

}

數據刪除數據刪除的實現

這裏以上面的表student為例來説明具體實現步驟。假定該表有一定量的數據,以一次刪除10條數據為例,刪除過程如下:

數據刪除提取偽列集合

提取符合條件的ROWID集合,無條件刪除全部記錄。若是有條件的情況,只需要將條件作為字符串加入到SQL字符串變量中。設置ROWID集合不超過10,構造ROWID集合字符串。 [1] 

數據刪除根據偽列值刪除數據

構造動態SQL語句,調用CADOConn::ExecuteSQL函數執行SQL語句,一次可刪除10條記錄數據。一般來説,一次刪除的記錄越多,速度越快,但是佔用的ROLLBACK短也越大。 [1] 
示例代碼如下:
int len=0,k;
CString rowid,rowidSet="",Deletesql;
CString selstr="select rowid from student";
Adoconn.GetRecordSet(selstr);
int Count=Adoconn.GetRecordCount();
while(Count>0)
{
  k=Count>10?10:Count;                              //ROWID集合數不超過10個
  for(int j=0;j<k;j++)
  {
      Adoconn.GetCollect("rowid",rowid);
      rowidSet +="'"+",";                          //構造ROWID集合字符串
      Adoconn.m_pRecordset->MoveNext();
  }
  len=rowidSet.Getlength()-1;
  Deletesql="DELETE tempstudent WHERE rowid IN";    //構造動態SQL字符串
  Deletesql+="("+rowidSet.Left(len)+")";
  Adoconn.ExecuteSQl(Deletesql);
  Count-=10;
  rowidSet="";
}
Adoconn.Close;                                       //關閉記錄
參考資料
  • 1.    劉天時,宋新愛,李皎,張留美編著.軟件案例分析.北京:清華大學出版社,2016:159-161