2016年4月15日 星期五

SEQUENCE、INDEX (DDL 六)

※SEQUENCE

其他的資料庫有自動流水號的功能,而Oracle在11g(含)之前都沒有,之前都一直用這個Sequence


※增刪改查

CREATE SEQUENCE xxx;
CREATE SEQUENCE ooo START WITH 5;
CREATE SEQUENCE zzz START WITH -5 MINVALUE -2000;
CREATE SEQUENCE yyy INCREMENT BY -2000;
CREATE SEQUENCE aaa MAXVALUE 2000 MINVALUE 1 INCREMENT BY 40 CACHE 48 CYCLE;
    
ALTER SEQUENCE aaa MAXVALUE 2500;
    
DROP SEQUENCE aaa;
    
SELECT xxx.NEXTVAL from dual;
SELECT ooo.NEXTVAL from dual;
SELECT zzz.CURRVAL from dual;
    
SELECT * from USER_SEQUENCES

※設定完用NEXTVAL和CURRVAL,可以得知下一個和目前的sequence是多少,但剛創建完一定要執行過NEXTVAL後,才能執行CURRVAL



※選項

官方文件:創建修改刪除
可以得知創建總共有16種選項,修改有15種(少了創建的START WITH)

以下的預設值沒特別寫就是NOxxx:
START WITH:這個選項ALTER沒有,是設定初始值的,當然不會有
    預設值正數是MINVALUE,負數是MAXVALUE
INCREMENT BY:一次增加多少,正數往上增加;負數往下,預設是1
MAXVALUE/NOMAXVALUE:設定最大值,預設是10的28次方減1
MINVALUE/NOMINVALUE:設定最小值,預設是0,可以設到10的27次方減1
CYCLE/NOCYCLE:要不要循環,不環循到臨界點的時候就會出錯誤訊息
CACHE/NOCACHE:預設是20,用完了再去資料庫要20,最主要是要降低和資料庫字典要值的次數,可以增加效能

以下六個我無法理解:
ORDER/NOORDER
KEEP/NOKEEP
SESSION/GLOBAL:預設是GLOBAL



※注意

設定CACHE容易出現的錯誤:
CREATE SEQUENCE aaa MAXVALUE 2000 MINVALUE -200 INCREMENT BY -40 CACHE 48 CYCLE;

如果沒設定好會出「ORA-04013: 要放到 CACHE 中的數目必須小於一個循環週期」的錯
官方有個公式(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
如果CACHE大於這個數字就會報這個錯(等於不會)
CEIL是天花板,就是往上(正數);ABS就是絕對值(絕對是正數的值)
以這個例子就是
(CEIL(2000-(-200))) / ABS(-40)
2200/40 = 55
所以只要CACHE設定超過55就會報這個錯



※流水號

流水號終於在12c這一版增加了


CREATE TABLE t1 (
    id NUMBER GENERATED AS IDENTITY,
    name VARCHAR2(10)
);
    
CREATE TABLE t2 (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 10),
    name VARCHAR2(10)
);

※第一條SQL是不加選項,什麼都用預設的

※要加選項就用第二條SQL



※INDEX

官網連結
主要是加快查詢速度用的

語法:
CREATE [UNIQUE|BITMAP] INDEX INDEX ON 表(欄[,欄...]) [USABLE|UNUSABLE]
最後面什麼都不打,預設是USABLE,表示可以用的意思

使用sys登入後,下「SET AUTOTRACE ON;」(要關掉改OFF即可)

※要注意每次執行完SQL語句都要按一次上面的按鈕才會更新

※如果用sqlplus,還可以看到更詳細的資訊,如時間…等

※執行最後一條SQL後,紅框的FULL會變成ROWID,ROWID是效能最快的;FULL指的是一行一行去掃描

※由於INDEX在工作時,我從來沒用過,不知會出什麼問題,只能提供官網連結(上面有提供了),拉到最下面也有很多範例,還有一個我覺得寫的很好的文章

※如要刪除,就下「DROP INDEX index名稱」

沒有留言:

張貼留言