oracle中主键的建立,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值时,可以有重复的,而其他的则不能插入重复值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值