此文轉自:http://blog.sina.com.cn/s/blog_439f80c4010094n1.html
創建主鍵:
alter table T add primary key (V)
T是表名,V是列名
創建索引:
create index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );
創建一般索引,索引名為表名+列名
create unique index F2009100000NMINFOSYS_ZDM on f2009100000nminfo( SYS_ZDM );
創建唯一索引
create BITMAP index F2009100000NMINFOSYS_XIANG on f2009100000nminfo( SYS_XIANG );
創建位圖索引
完整語法如下:
CREATE (UNIQUE|BITMAP) INDEX [用戶名.]索引名 ON [用戶名.]表名 (列名 [ ASC | DESC], [列名 [ ASC | DESC]]...)
[ TABLESPACE 表空間名 ]
[ PCTFREE 正整型數 ]
[ INITRANS 正整型數 ]
[ MAXTRANS 正整型數 ]
[ 存儲子句 ]
[ LOGGING | NOLOGGING ]
[ NOSORT ]
Oracle中怎么知道表沒有建立主鍵?
一般的情況下,表的主鍵是必要的,沒有主鍵的表可以說是不符合設計規范的。
SELECT table_name FROM User_tables t WHERE NOT EXISTS
(SELECT table_name FROM User_constraints c WHERE constraint_type = 'P' AND t.table_name=c.table_name)
其它相關數據字典解釋
user_tables 表
user_tab_columns 表的列
user_constraints 約束
user_cons_columns 約束與列的關系
user_indexes 索引
Oracle建立自增主鍵
首先,你要有一張表!
CREATE TABLE example(
ID Number(4) NOT NULL PRIMARY KEY,
NAME VARCHAR(25),
PHONE VARCHAR(10),
ADDRESS VARCHAR(50));
如果對於以上的建表語句還有疑問的話,建議您不要繼續了!有那么些時間您還不如去看看金庸讀讀瓊瑤!
然后,你需要一個自定義的sequence
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
NOCACHE -- 不建緩沖區
以上代碼完成了一個序列(sequence)的建立過程,名稱為emp_sequence,范圍是從1開始到無限大(無限大的程度是由你機器決定的),nocycle 是決定不循環,如果你設置了最大值那么你可以用cycle 會使seq到最大之后循環.對於nocache順便說一下如果你給出了cache值那么系統將自動讀取你的cache值大小個seq
,這樣在反復操作時會加快運行速度,但如果遭遇意外情況如當機了或oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂建議用cache,因為時間就是金錢呀!跑題了!)
書接上文,你只有了表和序列還不夠,還需要一個觸發器來執行它!代碼如下:
CREATE TRIGGER "觸發器名稱" BEFORE
INSERT ON example FOR EACH ROW WHEN (new.id is null)
begin
select emp_sequence.nextval into: new.id from dual;
end;
打完收工!下面你就試試插入數據吧!
INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');
Primary Key與Unique Key
Primary key 與Unique Key都是唯一性約束。但二者有很大的區別:
1、Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。而UNIQUE KEY 對列沒有此要求。
2、一個表只能有一個PRIMARY KEY,但可以有多個UNIQUE KEY。
下面以測試說明:
SQL> create table t (a int,b int,c int,d int);
Table created.
SQL> desc t
Name Null? Type
----------------------------------------- -------- -----------
A NUMBER(38)
B NUMBER(38)
C NUMBER(38)
D NUMBER(38)
SQL> alter table t add constraint pk_t primary key (a,b);
Table altered.
SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------------
A NOT NULL NUMBER(38)
B NOT NULL NUMBER(38)
C NUMBER(38)
D NUMBER(38)
可以看到A、B兩個列都自動改為了NOT NULL
SQL> alter table t modify (a int null);
alter table t modify (a int null)
*
ERROR at line 1:
ORA-01451: column to be modified to NULL cannot be modified to NULL
可以看到,列A不允許改為NULL
SQL> alter table t drop constraint pk_t;
Table altered.
SQL> alter table t add constraint uk_t_1 unique (a,b);
Table altered.
SQL> desc t
Name Null? Type
----------------------------------------- -------- -----------
A NUMBER(38)
B NUMBER(38)
C NUMBER(38)
D NUMBER(38)
我們看到列A又變回了NULL。
注意到,在刪除主鍵時,列的NULLABLE會回到原來的狀態。如果在創建主鍵后,對原來為NULL的主鍵列,顯式設為NOT NULL,在刪除主鍵后仍然是NOT NULL。比如在創建主鍵后,執行下面的操作,可以看到:
SQL> alter table t modify (b int not null);
Table altered.
SQL> alter table t drop constraint pk_t;
Table altered.
SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------
A NUMBER(38)
B NOT NULL NUMBER(38)
C NUMBER(38)
D NUMBER(38)
再做如下的實驗:
SQL> drop table t;
Table dropped.
SQL> create table t (a int,b int,c int,d int);
Table created.
SQL> alter table t add constraint uk_t_1 unique (a,b);
Table altered.
SQL> alter table t add constraint uk_t_2 unique (c,d);
Table altered.
可以看到可以增加兩個UNIQUE KEY。看看能不能增加兩個主鍵:
SQL> alter table t add constraint pk_t primary key (c);
Table altered.
SQL> alter table t add constraint pk1_t primary key (d);
alter table t add constraint pk1_t primary key (d)
*
ERROR at line 1:
ORA-02260: table can have only one primary key
由此可以看到一個表只能有一個主鍵。
SQL> alter table t drop constraint pk_t;
Table altered.
SQL> insert into t (a ,b ) values (null,null);
1 row created.
SQL> /
1 row created.
SQL> insert into t (a ,b ) values (null,1);
1 row created.
SQL> /
insert into t (a ,b ) values (null,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.UK_T_1) violated
SQL> insert into t (a ,b ) values (1,null);
1 row created.
SQL> /
insert into t (a ,b ) values (1,null)
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.UK_T_1) violated
主鍵和唯一鍵約束是通過參考索引實施的,如果插入的值均為NULL,則根據索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時,可以有重復的,而其他的則不能插入重復值。