※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是清空整個回收表用的
沒有留言:
張貼留言