-
數據刪除
鎖定
如果表格中存在錯誤或重複的數據,比較簡單、快捷的方法就是選定該數據,然後將其刪除。進行數據刪除時分為兩種:常用數據刪除的方法和偽列數據刪除的方法。
- 中文名
- 數據刪除
- 外文名
- Data deletion
- 對 象
- 表中錯誤或重複的數據
- 簡單問題
- 直接使用DELETE語句
- 複雜問題
- 先分割再使用DELETE語句
- 應用學科
- 數據庫原理
數據刪除常用數據刪除方法
用DELETE語句刪除數據庫表中數據,當刪除的數據量不多時,可簡單地一次性刪除,但是當遇到數據量很大的情況系下,需要進行數據分割。可根據數據表自身特點按照字段特徵來進行分割,不同的數據表中有不同的字段就需要進行不同的分割,根據分割反覆進行DETELE刪除操作,否則就可能出現回滾段空間滿錯誤。
[1]
Oracle數據庫有一個或多個回滾段。回滾段是數據庫的一部分,是一個存儲區域,數據庫使用該存儲區域存放更新的事物或刪除行的數據值。刪除的數據原值就存在回滾段,對於批量數據可以分配給較大的回滾段,但也是有限的。每個回滾段的塊只能包含一個事物的信息,當刪除的數據記錄達到一定的數量,膨脹到難以承受的程序就不能進行相應正常的工作了。
[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條數據為例,刪除過程如下:
數據刪除提取偽列集合
數據刪除根據偽列值刪除數據
示例代碼如下:
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; //關閉記錄