设为首页 收藏本站
查看: 578|回复: 0

[经验分享] oracle 主键

[复制链接]

尚未签到

发表于 2018-9-14 12:10:10 | 显示全部楼层 |阅读模式
  在oracle中,我们创建一个主键,则同时自动创建了一个同名的唯一索引;删除主键,则主键约束和对应的唯一索引都删除了。这是我们经常见到的现象。
  发出一个创建主键的sql,oracle其实执行了两步:创建主键约束、创建/关联 唯一索引。步骤是这样的:
  创建主键约束时,检查该主键字段上是否已经存在唯一索引。若不存在,则自动创建同名唯一索引;若存在,则直接创建主键约束,并将该约束和已经存在的唯一索引对应上。
  删除主键约束时,可以决定是否保留对应的索引;删除唯一索引时,若存在对应的主键约束,则不能删除。
  总之,存在主键约束,则肯定存在与之对应的唯一索引,而存在唯一索引,不一定对应着有主键约束。
  下面我们验证一下:
  SQL> create table test_pri(a number(1), b number(1));
  表已创建。
  --1.创建主键,则自动创建同名唯一索引
  --1.1创建主键,主键约束和唯一索引同时创建
  SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
  表已更改。
  SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
  CONSTRAINT_NAME   TABLE_NAME   INDEX_NAME
  ----------------- ------------ -------------
  PK_TEST_PRI_A     TEST_PRI     PK_TEST_PRI_A
  SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
  INDEX_NAME       INDEX_TYPE   TABLE_NAME   UNIQUENES
  ---------------- ------------ ------------ ---------
  PK_TEST_PRI_A    NORMAL       TEST_PRI     UNIQUE
  --1.2 删除主键,主键约束和对应的唯一索引都删除了
  SQL> alter table test_pri drop constraint pk_test_pri_a;
  表已更改。
  SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
  未选定行
  SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
  未选定行
  --1.3其实删除主键时可以选择保留索引的
  SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
  表已更改。
  SQL> alter table test_pri drop constraint pk_test_pri_a keep index;
  表已更改。
  SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
  未选定行
  SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
  INDEX_NAME      INDEX_TYPE  TABLE_NAME  UNIQUENES
  --------------- ----------- ----------- ---------
  PK_TEST_PRI_A   NORMAL      TEST_PRI    UNIQUE
  --2.在存在唯一索引的列上创建主键,则只创建主键约束,同时将该约束与已有唯一索引关联上(名称可以不一致)
  SQL> drop index pk_test_pri_a;
  索引已丢弃。
  --2.1 先创建唯一索引,再创建主键,名称可以不一致
  SQL> create unique index pk_test_pri_a on test_pri(a);
  索引已创建。
  SQL> alter table test_pri add constraint pk_test_pri primary key(a);
  表已更改。
  SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
  INDEX_NAME      INDEX_TYPE  TABLE_NAME   UNIQUENES
  --------------- ----------- ------------ ---------
  PK_TEST_PRI_A   NORMAL      TEST_PRI     UNIQUE
  SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
  CONSTRAINT_NAME    TABLE_NAME   INDEX_NAME
  ------------------ ------------ -------------
  PK_TEST_PRI        TEST_PRI     PK_TEST_PRI_A
  --2.2 不可删除存在主键约束的唯一索引
  SQL> drop index PK_TEST_PRI_A;
  drop index PK_TEST_PRI_A
  *
  ERROR 位于第 1 行:
  ORA-02429: 无法删除用于强制唯一/主键的索引
  --2.3虽然两者名称不一致,但也是关联在一块的:删除约束,则对应的索引同时删除
  SQL> alter table test_pri drop constraint pk_test_pri;
  表已更改。
  SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
  未选定行
  SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
  未选定行


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-582731-1-1.html 上篇帖子: Oracle DG 修改逻辑Standby端数据 下篇帖子: oracle一些无聊的问题:;。.?/\|!@*
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表