2016年4月9日 星期六

CREATE、DROP、RENAME、TRUNCATE、回收表 (DDL 一)

※DDL

之前講的都是DML(資料處理語言),針對表的增刪改查,做完要commit,其他的session才會看的到
而DDL(資料定義語言),是創建、刪除、修改表,把它想成執行完會自動commit,所以待會講到CREATE、DROP、RENAME、TRUNCATE、FLASHBACK、PURGE(增刪改)時,假設有做update表的動作,但沒有commit,只要一執行DDL,那就會自動commit了,這點要注意


※新增

CREATE TABLE chess (
    id number(5),
    name varchar2(20),
    price number(5,2) DEFAULT 0,
    make_date1 date DEFAULT sysdate,
    make_date2 timestamp,
    pic clob
);

※chess要表名稱,自己想一個,「()」裡最左邊是欄位名稱,自己想名字,右邊為資料型態

官網連結,內鍵的有23種

※常用的就是下面那幾種了
.number:
可用int和float代替,number(5,2),5為全部位數,不包括小數點; 2為小數點位數
所以123.45是ok的;number(3, 0)等同number(3),沒有小數點的意思,上面官網連結的Table 2-2有NUMBER的說明,已經很清楚了

.varchar、varchar2、char:
char(5)就是長度是5,varchar2(5)就是最多長度是5,如果有個值是abc,那char取出來後面會包括兩個空格,varchar和varchar2不會,所以才叫var(變動)
varchar和varchar2目前都一樣,官方推薦用varchar2

.date、timestamp:
date年月日;timestamp年月日時分秒

.clob、blob:
c就是character,所以放的是文字;b就是byte,所以放的是圖片

.nXXX:
如nchar、nvarchar2、nclob,主要是存中文字,因為你輸入長度3,它可能內部會將你輸入的長度乘2或3,看編碼而定

※複製表

CREATE TABLE xxx AS SELECT * FROM emp;
CREATE TABLE xxx AS SELECT * FROM emp WHERE 1=0;

※也就是從emp這張表整個複製一份出來變成xxx

※第二條SQL的where永遠不成立,所以只會複製表結構,裡面沒有內容,算是一種運用吧!

※要注意CONSTRAINT 不複製,所以PK、FK都沒有,過幾篇會說明

※AS一定要打,而且不能打IS



※修改

RENAME xxx TO ooo;

※xxx是舊表名,ooo是新表名,就算有PK、FK也可以改



※刪除

DROP TABLE chess;
DROP TABLE chess PURGE;

※兩種方式都可以,差別在下面的資源回收表有說



※清空表

TRUNCATE TABLE xxx;
DELETE FROM xxx;

※TRUNCATE為DDL;DELETE為DML

※DDL比較快;但DML因為還沒commit,所以多一個反悔的機會



※查看表結構

DESC ooo;

※只能看到欄位名稱、欄位類型、是否接受null



※查看目前帳號的表

SELECT * FROM tab;

※資料字典分為兩類
.動態資料字典:隨著資料庫運行而更新的表,通常以「V$」開頭

.靜態資料字典又分成以下三種:
user_開頭:目前帳號的表
all_開頭:目前帳號可以存取的表
dba_開頭:所有的表,必需有權限



※回收表

就是將表刪除後,類似Windows的資源回收桶,還有還原的機會


DROP TABLE xxx;--1
SELECT * FROM tab;--2
SELECT * FROM recyclebin;--3
FLASHBACK TABLE xxx TO BEFORE DROP;--4

※第一步刪除完後,看第二步的表,會發現TNAME多一個「BIN$」開頭,「==$0」結尾的,表示已經到回收表裡了

※第三步的表就是回收表,從ORIGINAL_NAME也會發現剛剛刪除的xxx,如果有多個,那就表示之前刪除了很多,剛好名稱也是xxx

※如果名稱有多個,它還會幫我們多兩個記錄,
「SYS_IL」開頭,「$$」結尾和「SYS_LOB」開頭,「$$」結尾的
而且CREATETIME時間欄位和刪除的表一樣

※第四步使用這種語法能恢復表,它會恢復最接近目前時間且名稱和ORIGINAL_NAME一樣的(例如有三筆資料:1分鐘前刪的、2分鐘前刪的、3分鐘前刪的,會恢復1分鐘前刪的)

※恢復完成後,第二和第三步的表都會少一行

※如果不想進資源回收表,就使用DROP TABLE xxx PURGE;



※刪除回收表

回收表沒辦法用DELETE和TRUNCATE刪的,要用以下的語法


PURGE TABLE xxx;
PURGE recyclebin;

※第一條SQL是刪除一筆,如果有「SYS_IL」開頭,「$$」結尾和「SYS_LOB」開頭,「$$」結尾的,而且CREATETIME時間欄位和刪除的表一樣的,也會一起刪除
刪除的是離目前時間最遠的那一筆(例如有三筆資料:1分鐘前刪的、2分鐘前刪的、3分鐘前刪的,會刪除3分鐘前刪的)

※一筆一筆刪除太累了,所以第二條SQL是清空整個回收表用的

沒有留言:

張貼留言