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

 

primarykey与uniquekey都是唯一性约束,用来限制相同字段的值插入。但二者有很大的区别:

1.作为primarykey的1个或多个列必须为NOTNULL,
如果建表时此列设为NULL,在增加PRIMARYKEY时,列自动更改为NOTNULL。
而uniquekey约束的列可以为null,这是primarykey与uniquekey最大的区别。
2.一个表只能有一个primarykey(单列或多列,多列主键叫联合主键),但可以有多个uniquekey。
实例1:
createtablet(c1number(2),c2date,c3varchar2(5),c4int);
desct;
NameTypeNullableDefaultComments
————————————–
C1NUMBER(2)Y
C2DATEY
C3VARCHAR2(5)Y
C4INTEGERY
//
实例2:添加primarykey
altertabletaddconstraintt_pkprimarykey(c1,c2);
desct;
NameTypeNullableDefaultComments
————————————–
C1NUMBER(2)
C2DATE
C3VARCHAR2(5)Y
C4INTEGERY
我们看到,将c1,c2列设为联合主键后,他们变为notnull;
如果在建表时就指定了主键的话,主键列将会默认为notnull。
//
如果我们在添加一个primarykey,那么我们将会得到一个错误:
altertabletaddconstraintt_pk_2primarykey(c3,c4)
ORA-02260:tablecanhaveonlyoneprimarykey
//
实例3:添加uniquekey
altertabletaddconstraintunique_key_tunique(c3,c4);
实例4:添加数据
insertintot(c1,c2,c3,c4)
values(10,sysdate,’abc’,3);
1rowinserted
//
insertintot(c1,c2,c3,c4)
values(11,sysdate,’abc’,3);
ORA-00001:uniqueconstraint(SCOTT.UNIQUE_KEY_T)violated
我们看到,添加的第二条数据违反了刚刚创建的唯一键约束;
将unique_key_t删除,添加就能成功了。
实例5:删除uniquekey
altertabletdropconstraintunique_key_t;
insertintot(c1,c2,c3,c4)
values(11,sysdate,’abc’,3);
1rowinserted
//
实例6:删除primarykey
altertabletdropconstraintt_pk;
Tablealtered
//
desct;
NameTypeNullableDefaultComments
————————————–
C1NUMBER(2)Y
C2DATEY
C3VARCHAR2(5)Y
C4INTEGERY
删除主键约束后,c1,c2列由恢复了原来的默认值null。
//
3.其实primarykey也是uniquekey,被primarykey约束的列notnull,并且不允许重复
实例7:
truncatetablet;
Tabletruncated
//
altertabletaddconstraintt_pkprimarykey(c1,c2);
Tablealtered
//
insertintot(c1,c2,c3,c4)
values(1,to_date(’2011-01-01′,’yyyy-mm-dd’),’csdn’,10);
1rowinserted
//
insertintot(c3,c4)
values(‘china’,1);
ORA-01400:cannotinsertNULLinto(“SCOTT”.”T”.”C1″)
//
insertintot(c1,c2,c3,c4)
values(1,to_date(’2011-01-01′,’yyyy-mm-dd’),’csdn’,10);
ORA-00001:uniqueconstraint(SCOTT.T_PK)violated
这里,我们看到primarykeyt_pk变成了unique约束,证明了主键约束也是唯一约束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值