oracle如何刪除記錄 oracle刪除記錄日志

oracle數(shù)據(jù)庫刪除數(shù)據(jù)Delete語句和Truncate語句的使用比較

當表中的數(shù)據(jù)不需要時 則應(yīng)該刪除該數(shù)據(jù)并釋放所占用的空間 刪除表中的數(shù)據(jù)可以使用Delete語句或者Truncate語句 下面分別介紹 一 delete語句 ( )有條件刪除 語法格式 delete [from] table_name [where condition]; 如 刪除users表中的userid為 的數(shù)據(jù) delete from users where userid= ; ( )無條件刪除整個表數(shù)據(jù) 語法格式 delete table_name; 如 刪除user表中的所有數(shù)據(jù) delete users ; 二 Truncate語句 使用Truncate語句是刪除表中的所有記錄 語法格式 Truncate [table] table_name; ( )刪除所有記錄不保留記錄占用空間 Truncate [table] table_name [drop storage]; 如 刪除users表中的所有數(shù)據(jù)并不保存占用空間 Truncate table users drop storage; 由于默認使用drop storage關(guān)鍵字 所以可以省略 drop storage; ( )刪除所有記錄保留記錄占用空間 Truncate [table] table_name [reuse storage]; 如 刪除users表中的所有數(shù)據(jù)并保存占用空間 Truncate table users reuse storage; 三 兩種刪除語句的對比 由于delete語句刪除記錄時候 記錄是逐條刪除的 而Truncate 語句刪除數(shù)據(jù)時不產(chǎn)生回退信息 所以如果需要刪除大量數(shù)據(jù)的時候使用delete則占用較多的系統(tǒng)資源 而如果使用Truncate 則會快的多 下面通過實例說明一下 首先建立user表 create table users ( userid varchar ( ) username varchar ( ) userpass varchar ( ) );復制代碼 接著插入一條數(shù)據(jù) insert into users values( GavinDream ); 使用復制插入方法插入幾萬條數(shù)據(jù) insert into users(userid username userpass) select * from users;我插入了 條數(shù)據(jù) 使用delete刪除花費時間為 seconds 然后又插入了二倍的數(shù)據(jù) 但使用truncate花費時間僅僅為 seconds 如下圖所示 lishixinzhi/Article/program/Oracle/201405/30860

“專業(yè)、務(wù)實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于做網(wǎng)站、網(wǎng)站制作、軟件開發(fā)、設(shè)計服務(wù)業(yè)務(wù)。我們始終堅持以客戶需求為導向,結(jié)合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領(lǐng)市場!

oracle怎么刪除一個表中的數(shù)據(jù)

1.

刪除無任何數(shù)據(jù)對象的表空間:

首先使用pl/sql界面化工具,或者使用oracle自帶的sql

plus工具,連接需要刪除的表空間的oracle數(shù)據(jù)局庫。

確認當前用戶是否有刪除表空間的權(quán)限,如果沒有

drop

tablespace,請先用更高級的用戶(如sys)給予授權(quán)或者直接用更高級的用戶。

用drop

tablespace

xxx

,刪除需要刪除的表空間。

2.

刪除有任何數(shù)據(jù)對象的表空間

使用drop

tablespace

xxx

including

contents

and

datafiles;來刪除表空間。

3.

注意事項:

如果drop

tablespace語句中含有datafiles,那datafiles之前必須有contents關(guān)鍵字,不然會提示ora-01911錯誤

Oracle form 11g 刪除記錄快捷操作

選擇并按delete。

在菜單上找到:進入卸載程序:單擊卸載產(chǎn)品:單擊全部展開,除了oradb11g_home1外,勾選其他項目,單擊刪除:確認刪除:刪除結(jié)束。

oracle快速刪除重復的記錄

正在看的ORACLE教程是:oracle快速刪除重復的記錄。做項目的時候,一位同事導數(shù)據(jù)的時候,不小心把一個表中的數(shù)據(jù)全都搞重了,也就是說,這個表里所有的記錄都有一條重復的。這個表的數(shù)據(jù)是千萬級的,而且是生產(chǎn)系統(tǒng)。也就是說,不能把所有的記錄都刪除,而且必須快速的把重復記錄刪掉。

對此,總結(jié)了一下刪除重復記錄的方法,以及每種方法的優(yōu)缺點。

為了陳訴方便,假設(shè)表名為Tbl,表中有三列col1,col2,col3,其中col1,col2是主鍵,并且,col1,col2上加了索引。

1、通過創(chuàng)建臨時表

可以把數(shù)據(jù)先導入到一個臨時表中,然后刪除原表的數(shù)據(jù),再把數(shù)據(jù)導回原表,SQL語句如下:

creat table tbl_tmp (select distinct* from tbl);truncate table tbl;//清空表記錄insert into tbl select * from tbl_tmp;//將臨時表中的數(shù)據(jù)插回來。

這種方法可以實現(xiàn)需求,但是很明顯,對于一個千萬級記錄的表,這種方法很慢,在生產(chǎn)系統(tǒng)中,這會給系統(tǒng)帶來很大的開銷,不可行。

2、利用rowid

在oracle中,每一條記錄都有一個rowid,rowid在整個數(shù)據(jù)庫中是唯一的,rowid確定了每條記錄是oracle中的哪一個數(shù)據(jù)文件、塊、行上。在重復的記錄中,可能所有列的內(nèi)容都相同,但rowid不會相同。SQL語句如下:

delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowidb.rowid and a.col1=b.col1 and a.col2 = b.col2)

如果已經(jīng)知道每條記錄只有一條重復的,這個sql語句適用。但是如果每條記錄的重復記錄有N條,這個N是未知的,就要考慮適用下面這種方法了。

3、利用max或min函數(shù)

這里也要使用rowid,與上面不同的是結(jié)合max或min函數(shù)來實現(xiàn)。SQL語句如下

delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//這里max使用min也可以

或者用下面的語句

delete from tbl awhere rowid(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//這里如果把max換成min的話,前面的where子句中需要把""改為""

跟上面的方法思路基本是一樣的,不過使用了group by,減少了顯性的比較條件,提高效率。SQL語句如下:

deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) 1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) 1)

還有一種方法,對于表中有重復記錄的記錄比較少的,并且有索引的情況,比較適用。假定col1,col2上有索引,并且tbl表中有重復記錄的記錄比較少,SQL語句如下4、利用group by,提高效率

oracle某個字段有重復數(shù)據(jù),如何刪除多余數(shù)據(jù)只保留1條

1、查找表中多余的重復記錄,重復記錄是根據(jù)單個字段(peopleId)來判斷。

2、刪除表中多余的重復記錄,重復記錄是根據(jù)單個字段(peopleId)來判斷,只留有rowid最小的記錄。

3、查找表中多余的重復記錄(多個字段)。

4、刪除表中多余的重復記錄(多個字段),只留有rowid最小的記錄。

5、查找表中多余的重復記錄(多個字段),不包含rowid最小的記錄。就完成了。

Oracle中如何刪除重復數(shù)據(jù)

我們可能會出現(xiàn)這種情況 某個表原來設(shè)計不周全 導致表里面的數(shù)據(jù)數(shù)據(jù)重復 那么 如何對重復的數(shù)據(jù)進行刪除呢?

重復的數(shù)據(jù)可能有這樣兩種情況 第一種時表中只有某些字段一樣 第二種是兩行記錄完全一樣

一 對于部分字段重復數(shù)據(jù)的刪除

先來談?wù)勅绾尾樵冎貜偷臄?shù)據(jù)吧

下面語句可以查詢出那些數(shù)據(jù)是重復的

select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*)

將上面的號改為=號就可以查詢出沒有重復的數(shù)據(jù)了

想要刪除這些重復的數(shù)據(jù) 可以使用下面語句進行刪除

delete from 表名 a where 字段 字段 in

(select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*) )

上面的語句非常簡單 就是將查詢到的數(shù)據(jù)刪除掉 不過這種刪除執(zhí)行的效率非常低 對于大數(shù)據(jù)量來說 可能會將數(shù)據(jù)庫吊死 所以我建議先將查詢到的重復的數(shù)據(jù)插入到一個臨時表中 然后對進行刪除 這樣 執(zhí)行刪除的時候就不用再進行一次查詢了 如下

CREATE TABLE 臨時表 AS

(select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*) )

上面這句話就是建立了臨時表 并將查詢到的數(shù)據(jù)插入其中

下面就可以進行這樣的刪除操作了

delete from 表名 a where 字段 字段 in (select 字段 字段 from 臨時表);

這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多

這個時候 大家可能會跳出來說 什么?你叫我們執(zhí)行這種語句 那不是把所有重復的全都刪除嗎?而我們想保留重復數(shù)據(jù)中最新的一條記錄??!大家不要急 下面我就講一下如何進行這種操作

在oracle中 有個隱藏了自動rowid 里面給每條記錄一個唯一的rowid 我們?nèi)绻氡A糇钚碌囊粭l記錄

我們就可以利用這個字段 保留重復數(shù)據(jù)中rowid最大的一條記錄就可以了

下面是查詢重復數(shù)據(jù)的一個例子

select a rowid a * from 表名 a

where a rowid !=

(

select max(b rowid) from 表名 b

where a 字段 = b 字段 and

a 字段 = b 字段

)

下面我就來講解一下 上面括號中的語句是查詢出重復數(shù)據(jù)中rowid最大的一條記錄

而外面就是查詢出除了rowid最大之外的其他重復的數(shù)據(jù)了

由此 我們要刪除重復數(shù)據(jù) 只保留最新的一條數(shù)據(jù) 就可以這樣寫了

delete from 表名 a

where a rowid !=

(

select max(b rowid) from 表名 b

where a 字段 = b 字段 and

a 字段 = b 字段

)

隨便說一下 上面語句的執(zhí)行效率是很低的 可以考慮建立臨時表 講需要判斷重復的字段 rowid插入臨時表中 然后刪除的時候在進行比較

create table 臨時表 as

select a 字段 a 字段 MAX(a ROWID) dataid from 正式表 a GROUP BY a 字段 a 字段 ;

delete from 表名 a

where a rowid !=

(

select b dataid from 臨時表 b

where a 字段 = b 字段 and

a 字段 = b 字段

);

mit;

二 對于完全重復記錄的刪除

對于表中兩行記錄完全一樣的情況 可以用下面語句獲取到去掉重復數(shù)據(jù)后的記錄

select distinct * from 表名

可以將查詢的記錄放到臨時表中 然后再將原來的表記錄刪除 最后將臨時表的數(shù)據(jù)導回原來的表中 如下

CREATE TABLE 臨時表 AS (select distinct * from 表名);

drop table 正式表;

insert into 正式表 (select * from 臨時表);

drop table 臨時表;

如果想刪除一個表的重復數(shù)據(jù) 可以先建一個臨時表 將去掉重復數(shù)據(jù)后的數(shù)據(jù)導入到臨時表 然后在從

臨時表將數(shù)據(jù)導入正式表中 如下

INSERT INTO t_table_bak

lishixinzhi/Article/program/Oracle/201311/17477

本文標題:oracle如何刪除記錄 oracle刪除記錄日志
網(wǎng)頁路徑:http://muchs.cn/article14/hgeode.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、網(wǎng)站維護、Google、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站