Oracle primary key和unique key的区别与联系

Oracle primary key和unique key的区别与联系,第1张

primary key与unique key都是唯一性约束。但二者有很大的区别:

1.作为primary key的1个或多个列必须为NOT NULL,

如果建表时此列设为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。

而unique key约束的列可以为null,这是primary key与unique key最大的区别。

2.一个表只能有一个primary key(单列或多列,多列主键叫联合主键),但可以有多个unique key。

实例1:

create table t(c1 number(2),c2 date,c3 varchar2(5),c4 int)

desc t

Name TypeNullable Default Comments

---- ----------- -------- ------- --------

C1 NUMBER(2) Y

C2 DATEY

C3 VARCHAR2(5) Y

C4 INTEGER Y

//

实例2:添加primary key

alter table t add constraint t_pk primary key(c1,c2)

desc t

Name TypeNullable Default Comments

---- ----------- -------- ------- --------

C1 NUMBER(2)

C2 DATE

C3 VARCHAR2(5) Y

C4 INTEGER Y

我们看到,将c1,c2列设为联合主键后,他们变为not null;

如果在建表时就指定了主键的话,主键列将会默认为not null。

//

如果我们在添加一个primary key,那么我们将会得到一个错误:

alter table t add constraint t_pk_2 primary key(c3,c4)

ORA-02260: table can have only one primary key

//

实例3:添加unique key

alter table t add constraint unique_key_t unique(c3,c4)

实例4:添加数据

insert into t(c1,c2,c3,c4)

values(10,sysdate,'abc',3)

1 row inserted

//

insert into t(c1,c2,c3,c4)

values(11,sysdate,'abc',3)

ORA-00001: unique constraint (SCOTT.UNIQUE_KEY_T) violated

我们看到,添加的第二条数据违反了刚刚创建的唯一键约束

将unique_key_t删除,添加就能成功了。

实例5:删除unique key

alter table t drop constraint unique_key_t

insert into t(c1,c2,c3,c4)

values(11,sysdate,'abc',3)

1 row inserted

//

实例6:删除primary key

alter table t drop constraint t_pk

Table altered

//

desc t

Name TypeNullable Default Comments

---- ----------- -------- ------- --------

C1 NUMBER(2) Y

C2 DATEY

C3 VARCHAR2(5) Y

C4 INTEGER Y

删除主键约束后,c1,c2列由恢复了原来的默认值null。

//

3.其实primary key也是unique key,被primary key约束的列not null,并且不允许重复

实例7:

truncate table t

Table truncated

//

alter table t add constraint t_pk primary key(c1,c2)

Table altered

//

insert into t(c1,c2,c3,c4)

values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10)

1 row inserted

//

insert into t(c3,c4)

values('china',1)

ORA-01400: cannot insert NULL into ("SCOTT"."T"."C1")

//

insert into t(c1,c2,c3,c4)

values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10)

ORA-00001: unique constraint (SCOTT.T_PK) violated

这里,我们看到primary key t_pk变成了unique约束,证明了主键约束也是唯一约束。

因为默认是不提交的,只有你退出或者手动提交你执行过的sql语句才行,在cmd的sql plus 界面可以执行完建表语句后输入commit/回车,应该就好使了。还有一种情况就是你不是同一个用户名,可能用一个系统角色在sql/plus 下建了表,然后用别的用户登录的Pl/sql。

你可以在PL/sql 的edit界面下输入sql语句与测试。因为cmd下如果换行而且上一行输出了的话就不好改了。至于你说的那个光标不能移动如果是同一行的话还真没见到过。

可以是让oracle 忽略就存在表内的重复值,并且新插入的数据遵守唯一约束.

*** 作步骤

1.检查当前oracle 唯一约束创建的索引的unique的列的值. 必须是not unique.

2.如果是unique这要删除该约束重新建,新建的约束先disable,并且要deferred

3.这时候检查oracle 唯一约束创建的索引的unique的列的值你会发现该索引时not unique

4.接下来你就可以enable 该约束了

明天天帖出示例,现在没时间


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11391336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存