目的:

测试一下,
1)如果一个表中已经创建了 唯一索引,那么再在 唯一索引上创建唯一键约束和主键约束,与直接创建主键约束与唯一键约束的区别
2)如果一个表中已经创建了 普通索引,那么再在 普通索引上创建唯一键约束和主键约束,与直接创建主键约束与唯一键约束的区别
主键、唯一键约束、唯一索引区别之创建
http://space.itpub.net/685769/viewspace-743314
主键、唯一键约束、唯一索引区别之删除
http://space.itpub.net/685769/viewspace-743403

主键、唯一键约束、唯一索引区别之修改
http://space.itpub.net/685769/viewspace-743328
一:创建测试表 t1,并创建唯一索引
SCOTT@ORA11GR2>create table t1
(
a int,
b int
);
Table created.
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>create unique index uidx_t1_a on t1(a);
Index created.
SCOTT@ORA11GR2>create unique index uidx_t1_b on t1(b);
Index created.
SCOTT@ORA11GR2>
二:利用ctas方式通过t1表 创建t2表
SCOTT@ORA11GR2>create table t2 as select * from t1;
Table created.
SCOTT@ORA11GR2>
此时要非常注意,ctas方式只创建了表的结构,相关的定义信息都没有,比如索引约束等,通过如下语句可以验证
SCOTT@ORA11GR2>select table_name,column_name,index_name from user_ind_columns where table_name=upper('t1');
TABLE_NAME      COLUMN_NAME     INDEX_NAME
--------------- --------------- ------------------------------
T1              A               UIDX_T1_A
T1              B               UIDX_T1_B
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select table_name,column_name,index_name from user_ind_columns where table_name=upper('t2');
no rows selected
SCOTT@ORA11GR2>
三:给t2表创建普通索引
SCOTT@ORA11GR2>create index idx_t2_a on t2(a);
Index created.
SCOTT@ORA11GR2>create index idx_t2_b on t2(b);
Index created.
SCOTT@ORA11GR2>
四:检查t1表和t2表的索引情况,t1表创建的是唯一索引,t2表创建的是普通索引
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t1');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
UIDX_T1_B                      UNIQUE    USERS
UIDX_T1_A                      UNIQUE    USERS
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t2');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IDX_T2_B                       NONUNIQUE USERS
IDX_T2_A                       NONUNIQUE USERS
SCOTT@ORA11GR2>

五:在t1表和t2表的a字段上创建主键约束
SCOTT@ORA11GR2>alter table t1 add constraint pk_t1_a primary key( a);
Table altered.
SCOTT@ORA11GR2>alter table t2 add constraint pk_t2_a primary key( a);
Table altered.
SCOTT@ORA11GR2>

六:在t1表和t2表的b字段上创建唯一键约束
SCOTT@ORA11GR2>alter table t1 add constraint uk_t1_a unique(b);
Table altered.
SCOTT@ORA11GR2>alter table  t2  add constraint uk_t2_a unique( b );
Table altered.
SCOTT@ORA11GR2>
七:验证一下t1和t2的约束和索引情况
我们发现,t1和t2的约束都已创建成功,不过,相应的索引都没有改变,还是启用原来的索引,并未新创建默认的唯一索引
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper(' t1');
TABLE_NAME      COLUMN_NAME     CONSTRAINT_TYPE    CONSTRAINT_NAME
--------------- --------------- ------------------ --------------------
T1              B               U                  UK_T1_A
T1              A               P                  PK_T1_A
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper(' t2');
TABLE_NAME      COLUMN_NAME     CONSTRAINT_TYPE    CONSTRAINT_NAME
--------------- --------------- ------------------ --------------------
T2              B               U                  UK_T2_A
T2              A               P                  PK_T2_A
SCOTT@ORA11GR2>

SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper(' t1');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
UIDX_T1_B                       UNIQUE    USERS
UIDX_T1_A                       UNIQUE    USERS
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper(' t2');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IDX_T2_B                       NONUNIQUE USERS
IDX_T2_A                        NONUNIQUE USERS
SCOTT@ORA11GR2>
八:t1表插入测试数据
SCOTT@ORA11GR2>insert into t1 values(null,1);
insert into t1 values(null,1)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T1"."A")
SCOTT@ORA11GR2>insert into t1 values(1,null);
1 row created.
SCOTT@ORA11GR2>insert into t1 values(2,1);

1 row created.
SCOTT@ORA11GR2>commit;
Commit complete.
SCOTT@ORA11GR2>select * from t1;
A          B
---------- ----------
1
2          1
SCOTT@ORA11GR2>insert into t1 values(2,2);
insert into t1 values(2,2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_T1_A) violated
SCOTT@ORA11GR2>insert into t1 values(3,1);
insert into t1 values(3,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_T1_A) violated
SCOTT@ORA11GR2>

t1表验证结果:
主键无法插入null值,唯一键可以插入null值,主键和唯一键都不能重复
九:t2表插入测试数据
SCOTT@ORA11GR2>insert into t2 values(null,1);
insert into t2 values(null,1)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T2"."A")
SCOTT@ORA11GR2>insert into t2 values(1,null);
1 row created.
SCOTT@ORA11GR2>insert into t2 values(2,1);
1 row created.
SCOTT@ORA11GR2>commit;
Commit complete.
SCOTT@ORA11GR2>select * from t2;
A          B
---------- ----------
1
2          1
SCOTT@ORA11GR2>

SCOTT@ORA11GR2>insert into t2 values(2,2);
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_T2_A) violated
SCOTT@ORA11GR2>insert into t2 values(3,1);
insert into t2 values(3,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_T2_A) violated
SCOTT@ORA11GR2>

t2表验证结果同t1表

十:删除约束
1)删除t1约束
SCOTT@ORA11GR2>alter table t1 drop constraint uk_t1_a;
Table altered.
SCOTT@ORA11GR2>alter table t1 drop constraint pk_t1_a;
Table altered.
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper('t1');
no rows selected
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t1');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
UIDX_T1_B                      UNIQUE    USERS
UIDX_T1_A                      UNIQUE    USERS
SCOTT@ORA11GR2>
2)删除t2约束

SCOTT@ORA11GR2>alter table t2 drop constraint uk_t2_a cascade;
Table altered.
SCOTT@ORA11GR2>alter table t2 drop primary key;
Table altered.
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper('t2');
no rows selected
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t2');
INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IDX_T2_B                       NONUNIQUE USERS
IDX_T2_A                       NONUNIQUE USERS
SCOTT@ORA11GR2>
注:我印象中,在删除唯一约束的时候,加上cascade子句,那么,会级联删除相关的索引,可以通过最近的测试发现,如果索引是唯一约束自动创建的,那么不加cascade也能将索引删除,如果在已存在的索引上创建唯一约束,那么加不加cascade都无法级联删除索引,这个可以理解,因为那个索引本身就不是你创建的,可是自动创建的索引怎么跟我以前测试的不同了,难道我记错了?


小结:
1)在已存在索引的基础上创建约束,无论已存在的索引是唯一的还是普通的,那么他们的约束都是起作用的(不过,普通索引和唯一索引上创建的约束,在生成执行计划的时候,应该是不同的),也就是说,主键约束和唯一键约束的唯一性不单单是有唯一索引控制的,本身主键约束和唯一键约束就有控制唯一的能力。
2)删除在已存在索引上创建的约束,那么只删除约束,对索引没有什么影响。
3)第十步中删除主键的方法有两种,一种是利用主键约束的名称删除,另一种是直接删除表中的主键(因为一张表中只允许有一个主键,索引,oracle也支持直接删除primary key)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/685769/viewspace-743405/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/685769/viewspace-743405/

【约束】唯一键和主键在已存在索引的字段上创建和直接创建的区别相关推荐

  1. mysql 唯一键和主键_MySQL唯一键和主键

    用下面的命令创建一个表: CREATE TABLE people ( age INT NOT NULL, name CHAR(20) NOT NULL ); 我们可以多次插入一个项. 特别地,我们可以 ...

  2. MySQL中的主键、唯一键、外键对比

    一.主键 主键:每张表中只能有一个字段(复合主键可以有多个字段)使用此属性,用来唯一约束该字段中的数据,不能重复 1.增加主键: 在创建表的时候,直接在字段后,添加primary key关键字 CRE ...

  3. 主键、唯一键、外键、

    类型 保证唯一性 是否允许空 一个表中可以有多少个 是否允许组合 主键(primary key) 是 否 至多一个,可以为0 允许(不推荐,因为不稳定) 唯一(unique) 是 是 可以有多个 允许 ...

  4. oracle 主键 唯一性,oracle 唯一索引,唯一约束,主键之间的联系

    主键(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录,在两个表的关系中,主键用来在一个表中引用来自于另一个表中的特定记录,,主键时一种唯一关键字,表定义的一部分. ...

  5. oracle 删除主键级联删除唯一索引

    删除主键级联删除唯一索引: alter table CBS_AG_CNTR_MTHD drop CONSTRAINT PK_CBS_AG_CNTR_MTHD cascade drop index;

  6. mysql主键索引需要创建_mysql主键还需要建立索引吗?

    mysql主键不需要建立索引,主键具备索引的功能:当创建或设置主键的时候,mysql会自动添加一个与主键对应的唯一索引,不需要再做额外的添加.数据库管理系统对于主键会自动生成唯一索引,所以主键是一个特 ...

  7. sql主键和唯一键和外键

    mysql数据库中对字段的约束里存在主键约束,也存在唯一键约束,这两种约束很容易出现混淆的情况,这里讲一下两个的区别: 主键和唯一键的对比: 约束 保证唯一性 是否为空 一个表中有多少个 是否允许组合 ...

  8. oracle主键约束删除,oracle删除主键查看主键约束及创建联合主键

    oracle删除主键查看主键约束及创建联合主键 1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 执行上面的SQL可以删除主键:如果不成功可以用 ALTER ...

  9. oracle列添加主键约束,Oracle如何添加主键约束

    工具/材料 SQL Developer 操作方法 01 首先打开SQL Developer软件,找一个没有主键约束的表,如下图所示 02 然后我们新建一个查询,在界面中输入如下的约束修改语句,如下图所 ...

最新文章

  1. python3语法错误-关于在python3.7当中的语法错误!
  2. mysql 注入 file load_Mysql注入中into outfile和load_file()总结
  3. 对开发者有用的英文网站合集,建议收藏!
  4. vim移动一行或一段代码
  5. matlab向万里电子版,万里学院matlab第一次试验报告格式
  6. Struts2+Spring+Hibernate搭建全解!
  7. [PhoneGap]Mac下搭建PhoneGap开发环境
  8. 实战丨基于接口的银行系统自动化测试实践
  9. 实现人工智能价值的障碍有哪些?
  10. DEA模型中的CCR模型
  11. 姚前:新型货币战争才刚刚开始
  12. 西南农业大学成教学院有计算机专业吗,西南农业大学计算机应用与技巧网上功课及答案...
  13. 留给10年后的自己观看,T4-7生活就像那条小巷!
  14. 洛谷 P3435 [POI2006]OKR-Periods of Words(KMP+记忆化搜索)
  15. zigbee抓包实验过程
  16. 校企同游快乐工作——湖南工程职院美和易思教师开展素质拓展活动
  17. 区块链-区块链的概念
  18. 没考计算机水平怎么填6,“计算机水平”怎么填,没曾考级,只参加过大 – 手机爱问...
  19. ftp服务器文件防盗链,IIS防盗链组件
  20. python手机壁纸_用Python生成自己专属的手机春节壁纸

热门文章

  1. IOS访问限制密码忘记解决方案
  2. Springboot实现登录拦截的三种方式
  3. 性能对比|FASS iSCSI vs NVMe/TCP
  4. 【论文精读3】MVSNet系列论文详解-P-MVSNet
  5. 微信小程序-006-投票功能-搜索投票
  6. 怎么看光驱有没有带刻录DVD功能
  7. 信贷风险指标你都懂吗?
  8. 跟上节奏 大数据时代十大必备IT技能
  9. 键盘VK键值(java键盘监听)
  10. Liang-GaRy啃linux书想吐(六)