oracle 建立主鍵與索引【轉】


此文轉自: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 f2009100000nminfoSYS_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值時,可以有重復的,而其他的則不能插入重復值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM