博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle中主键的建立,oracle 建立主键与索引
阅读量:6360 次
发布时间:2019-06-23

本文共 3798 字,大约阅读时间需要 12 分钟。

一般的情况下,表的主键是必要的,没有主键的表可以说是不符合设计规范的。

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

转载地址:http://knima.baihongyu.com/

你可能感兴趣的文章
github/gitlab 管理多个ssh key
查看>>
[SQL in Azure] High Availability and Disaster Recovery for SQL Server in Azure Virtual Machines
查看>>
python单线程爬取阿里云maven库
查看>>
访问网络文件共享服务
查看>>
[转载] 七龙珠第一部——第104话 悟空复活吧
查看>>
Goldengate 维护
查看>>
如何验证下载的Microsoft软件是否为正版??
查看>>
Python文件操作
查看>>
用shell实现rpm包的自动安装
查看>>
大型网站技术架构(四)网站的高性能架构
查看>>
BAT资深架构师告诉你从程序员到架构师,你需要掌握什么能力?
查看>>
电脑被格式化了如何恢复?
查看>>
母亲像一道明亮的光
查看>>
js判断数组中是否包含某元素
查看>>
关于tcp/ip三次握手的理解和详细分析
查看>>
高性能web开发之网络传输环节
查看>>
遍历Map的四种方法
查看>>
https、SSL与数字证书介绍
查看>>
【VMCloud云平台】SCVMM配置(二)创建一片云
查看>>
http://bbs.linuxtone.org/thread-15681-1-1.html
查看>>