數據刪除

數據刪除

如果表格中存在錯誤或重複的數據,比較簡單、快捷的方法就是選定該數據,然後將其刪除。進行數據刪除時分為兩種:常用數據刪除的方法和偽列數據刪除的方法。

基本介紹

  • 中文名:數據刪除
  • 外文名:Data deletion
  • 對象:表中錯誤或重複的數據
  • 簡單問題:直接使用DELETE語句
  • 複雜問題:先分割再使用DELETE語句
  • 套用學科:資料庫原理
常用數據刪除方法,偽列數據刪除方法,偽列ROWID,MFC ADO獲取記錄集,數據刪除的實現,提取偽列集合,根據偽列值刪除數據,

常用數據刪除方法

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

偽列數據刪除方法

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

偽列ROWID

Oracle資料庫中每個表中都有一個名為ROWID的偽列,是一個18位元組[數據對象編號(6位元組)+檔案編號(3位元組)+塊編號(6位元組)+行編號(3位元組)]的字元串,它允許使用保留字ROWID作為列名來訪問任意行的地址。ROWID偽列不存存儲在資料庫中,不占用任何空間,也不能被修改或刪除。只要表格中存在某個行,就有對應該行的ROWID。由於ROWID具有唯一性,因此ROWID可看做是資料庫表中每一行唯一的關鍵字。
利用偽列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函式得到欄位值。
例如,從表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集合字元串。

根據偽列值刪除數據

構造動態SQL語句,調用CADOConn::ExecuteSQL函式執行SQL語句,一次可刪除10條記錄數據。一般來說,一次刪除的記錄越多,速度越快,但是占用的ROLLBACK短也越大。
示例代碼如下:
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;                                       //關閉記錄

相關詞條

熱門詞條

聯絡我們