在ORACLE表中刪除數(shù)據(jù)通常有兩種方法:一種是使用delete,一種是使用truncate。
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為濮陽企業(yè)提供專業(yè)的做網(wǎng)站、成都做網(wǎng)站,濮陽網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
delete 優(yōu)點(diǎn):1、可以增加WHERE條件來進(jìn)行選擇性刪除。
2、可以通過rollback進(jìn)行回滾。
缺點(diǎn):1、速度較慢。
truncate 優(yōu)點(diǎn):1、速度很快。
缺點(diǎn):1、不能加條件刪除。
2、無法通過rollback進(jìn)行數(shù)據(jù)回滾。
1.
刪除無任何數(shù)據(jù)對(duì)象的表空間:
首先使用pl/sql界面化工具,或者使用oracle自帶的sql
plus工具,連接需要?jiǎng)h除的表空間的oracle數(shù)據(jù)局庫(kù)。
確認(rèn)當(dāng)前用戶是否有刪除表空間的權(quán)限,如果沒有
drop
tablespace,請(qǐng)先用更高級(jí)的用戶(如sys)給予授權(quán)或者直接用更高級(jí)的用戶。
用drop
tablespace
xxx
,刪除需要?jiǎng)h除的表空間。
2.
刪除有任何數(shù)據(jù)對(duì)象的表空間
使用drop
tablespace
xxx
including
contents
and
datafiles;來刪除表空間。
3.
注意事項(xiàng):
如果drop
tablespace語句中含有datafiles,那datafiles之前必須有contents關(guān)鍵字,不然會(huì)提示ora-01911錯(cuò)誤
第一、如果有plsql客戶端,則可以使用該用戶登錄,選中所有表——右鍵drop即可。
第二、如果有刪除用戶的權(quán)限,則可以:
drop
user
user_name
cascade;
加了cascade就可以把用戶連帶的數(shù)據(jù)全部刪掉。
--創(chuàng)建用戶
create
user
用戶名
profile
default
identified
by
密碼
default
tablespace
表空間名稱
temporary
tablespace
temp
account
unlock;
--授權(quán)
grant
dba
to
用戶名;
grant
connect,resource
to
用戶名;
第三、如果沒有刪除用戶的權(quán)限,則可以執(zhí)行:
select
'drop
table
'||table_name||';'
from
cat
where
table_type='table'
delete from table where +條件\x0d\x0a例如 \x0d\x0adelete from emp where empno=7369; --刪除員工號(hào)為7369的員工記錄 單條記錄\x0d\x0adelete from emp where deptno=20; --刪除部門號(hào)為20的的所有員工記錄 多條記錄
1、你需要明白o(hù)racle數(shù)據(jù)結(jié)構(gòu)
首先數(shù)據(jù)以表table/索引index/視圖view等方式存在,而表/索引/視圖存儲(chǔ)在表空間,表空間對(duì)應(yīng)硬盤上的文件
2、數(shù)據(jù)庫(kù)包含數(shù)據(jù)字典或默認(rèn)的一些用戶或你創(chuàng)建的用戶,這些用戶訪問這些表或表空間
3、而這都需要存在一個(gè)實(shí)例instance
4、所以你如果刪除數(shù)據(jù),需要?jiǎng)h除表,然后表空間(或者直接刪除表空間連帶里面的表)
DROP TABLESPACE DATA_TS1 INCLUDING CONTENTS AND DATAFILES;
5、查詢都有哪些表空間
col file_name format a50
select TABLESPACE_NAME,FILE_NAME from dba_data_files order by TABLESPACE_NAME;
查詢表空間包含哪些表
col SEGMENT_NAME format a30
select distinct SEGMENT_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='DATA_TS1' order by SEGMENT_NAME;
6、生成所有表的drop語句
select 'drop table '||tname||' purge;' from tab order by tname;
7、用dbca刪除instance后,數(shù)據(jù)庫(kù)就像新安裝時(shí)候一樣干干凈凈
dbca -silent -deleteDatabase -sourceDB mydb -sysDBAUserName sys -sysDBAPassword db123456
或者用圖形界面刪除。
我們可能會(huì)出現(xiàn)這種情況 某個(gè)表原來設(shè)計(jì)不周全 導(dǎo)致表里面的數(shù)據(jù)數(shù)據(jù)重復(fù) 那么 如何對(duì)重復(fù)的數(shù)據(jù)進(jìn)行刪除呢?
重復(fù)的數(shù)據(jù)可能有這樣兩種情況 第一種時(shí)表中只有某些字段一樣 第二種是兩行記錄完全一樣
一 對(duì)于部分字段重復(fù)數(shù)據(jù)的刪除
先來談?wù)勅绾尾樵冎貜?fù)的數(shù)據(jù)吧
下面語句可以查詢出那些數(shù)據(jù)是重復(fù)的
select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*)
將上面的號(hào)改為=號(hào)就可以查詢出沒有重復(fù)的數(shù)據(jù)了
想要?jiǎng)h除這些重復(fù)的數(shù)據(jù) 可以使用下面語句進(jìn)行刪除
delete from 表名 a where 字段 字段 in
(select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*) )
上面的語句非常簡(jiǎn)單 就是將查詢到的數(shù)據(jù)刪除掉 不過這種刪除執(zhí)行的效率非常低 對(duì)于大數(shù)據(jù)量來說 可能會(huì)將數(shù)據(jù)庫(kù)吊死 所以我建議先將查詢到的重復(fù)的數(shù)據(jù)插入到一個(gè)臨時(shí)表中 然后對(duì)進(jìn)行刪除 這樣 執(zhí)行刪除的時(shí)候就不用再進(jìn)行一次查詢了 如下
CREATE TABLE 臨時(shí)表 AS
(select 字段 字段 count(*) from 表名 group by 字段 字段 having count(*) )
上面這句話就是建立了臨時(shí)表 并將查詢到的數(shù)據(jù)插入其中
下面就可以進(jìn)行這樣的刪除操作了
delete from 表名 a where 字段 字段 in (select 字段 字段 from 臨時(shí)表);
這種先建臨時(shí)表再進(jìn)行刪除的操作要比直接用一條語句進(jìn)行刪除要高效得多
這個(gè)時(shí)候 大家可能會(huì)跳出來說 什么?你叫我們執(zhí)行這種語句 那不是把所有重復(fù)的全都刪除嗎?而我們想保留重復(fù)數(shù)據(jù)中最新的一條記錄啊!大家不要急 下面我就講一下如何進(jìn)行這種操作
在oracle中 有個(gè)隱藏了自動(dòng)rowid 里面給每條記錄一個(gè)唯一的rowid 我們?nèi)绻氡A糇钚碌囊粭l記錄
我們就可以利用這個(gè)字段 保留重復(fù)數(shù)據(jù)中rowid最大的一條記錄就可以了
下面是查詢重復(fù)數(shù)據(jù)的一個(gè)例子
select a rowid a * from 表名 a
where a rowid !=
(
select max(b rowid) from 表名 b
where a 字段 = b 字段 and
a 字段 = b 字段
)
下面我就來講解一下 上面括號(hào)中的語句是查詢出重復(fù)數(shù)據(jù)中rowid最大的一條記錄
而外面就是查詢出除了rowid最大之外的其他重復(fù)的數(shù)據(jù)了
由此 我們要?jiǎng)h除重復(fù)數(shù)據(jù) 只保留最新的一條數(shù)據(jù) 就可以這樣寫了
delete from 表名 a
where a rowid !=
(
select max(b rowid) from 表名 b
where a 字段 = b 字段 and
a 字段 = b 字段
)
隨便說一下 上面語句的執(zhí)行效率是很低的 可以考慮建立臨時(shí)表 講需要判斷重復(fù)的字段 rowid插入臨時(shí)表中 然后刪除的時(shí)候在進(jìn)行比較
create table 臨時(shí)表 as
select a 字段 a 字段 MAX(a ROWID) dataid from 正式表 a GROUP BY a 字段 a 字段 ;
delete from 表名 a
where a rowid !=
(
select b dataid from 臨時(shí)表 b
where a 字段 = b 字段 and
a 字段 = b 字段
);
mit;
二 對(duì)于完全重復(fù)記錄的刪除
對(duì)于表中兩行記錄完全一樣的情況 可以用下面語句獲取到去掉重復(fù)數(shù)據(jù)后的記錄
select distinct * from 表名
可以將查詢的記錄放到臨時(shí)表中 然后再將原來的表記錄刪除 最后將臨時(shí)表的數(shù)據(jù)導(dǎo)回原來的表中 如下
CREATE TABLE 臨時(shí)表 AS (select distinct * from 表名);
drop table 正式表;
insert into 正式表 (select * from 臨時(shí)表);
drop table 臨時(shí)表;
如果想刪除一個(gè)表的重復(fù)數(shù)據(jù) 可以先建一個(gè)臨時(shí)表 將去掉重復(fù)數(shù)據(jù)后的數(shù)據(jù)導(dǎo)入到臨時(shí)表 然后在從
臨時(shí)表將數(shù)據(jù)導(dǎo)入正式表中 如下
INSERT INTO t_table_bak
lishixinzhi/Article/program/Oracle/201311/17477
文章標(biāo)題:oracle中怎么刪除數(shù) oracle中怎么刪除數(shù)據(jù)
轉(zhuǎn)載源于:http://jinyejixie.com/article22/hpchcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容