Oracle学习笔记(四)——Primary Key&Unique约束
来源:互联网 发布:刷粉丝的软件 编辑:程序博客网 时间:2024/06/16 01:39
Primary Key
primary key主键唯一表示一条记录,主键所包含的列(单个或多个)不能有重复值,所包含的列也不能为null。
创建测试所有的表test_constraint_tab
create table test_constraint_tab as select * from dba_objects;
查看test_constraint_tab的索引信息和约束信息
SQL> select index_name, index_type, table_name, table_owner from user_indexes wh ere table_name = upper('test_constraint_tab');未选定行SQL> select owner, constraint_name, constraint_type, table_name from user_constr aints where table_name = upper('test_constraint_tab');未选定行
test_constraint_tab现在还没有任何索引和约束信息,下面添加primary key约束后再查看索引和约束信息
SQL> alter table test_constraint_tab add constraint pk_object_id primary key(obj ect_id);表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------PK_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');OWNER CONSTRAINT_NAME C TABLE_NAME--------------------- ------------------------------ - ------------------------------SYS PK_OBJECT_ID P TEST_CONSTRAINT_TAB给表添加主键约束后自动创建了主键约束PK_OBJECT_ID和索引PK_OBJECT_ID。接着删除primary key约束,在查看索引和约束情况
SQL> alter table test_constraint_tab drop constraint pk_object_id;表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');未选定行SQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');未选定行可以看出删除约束后关联删除了自动创建的索引。接下来先在object_id列创建普通索引,再添加约束,然后再删除约束查看索引和约束情况
SQL> create index pk_object_id on test_constraint_tab(object_id);索引已创建。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------PK_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> alter table test_constraint_tab add constraint pk_object_id primary key(object_id);表已更改。SQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');OWNER CONSTRAINT_NAME C TABLE_NAME-------------- ------------------------------ - ------------------------------SYS PK_OBJECT_ID P TEST_CONSTRAINT_TABSQL> alter table test_constraint_tab drop constraint pk_object_id;表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------PK_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');未选定行
从上面执行的结果可以看出,可以先创建索引再添加同名的约束,采用这种方式创建约束后在drop掉约束索引不会自动删除。
继续进行测试,删除test_constraint_tab的索引和约束后,重新创建主键约束,然后尝试直接drop掉自动创建的索引
SQL> alter table test_constraint_tab add constraint pk_object_id primary key(object_id);表已更改。SQL> drop index PK_OBJECT_ID;drop index PK_OBJECT_ID *第 1 行出现错误:ORA-02429: 无法删除用于强制唯一/主键的索引SQL> alter table test_constraint_tab drop constraint pk_object_id;表已更改。SQL> create index pk_object_id on test_constraint_tab(object_id);索引已创建。SQL> alter table test_constraint_tab add constraint pk_object_id primary key(object_id);表已更改。SQL> drop index PK_OBJECT_ID;drop index PK_OBJECT_ID *第 1 行出现错误:ORA-02429: 无法删除用于强制唯一/主键的索引
从测试可以看出只要主键约束存在,不管是自动创建的索引还是在创建约束之前创建的索引都不能被删除。
Primary Key包含的列不允许存在NULL值。
SQL> create table test_constraint_tab2 ( 2 col1 varchar(20), 3 col2 varchar(20), 4 col3 varchar(20) 5 );表已创建。SQL> alter table test_constraint_tab2 add constraint pk_col1_col2 primary key(co l1, col2);表已更改。SQL> insert into test_constraint_tab2 (col1, col2, col3) values (null, null, 'col3_1');insert into test_constraint_tab2 (col1, col2, col3) values (null, null, 'col3_1') *第 1 行出现错误:ORA-01400: 无法将 NULL 插入 ("SYS"."TEST_CONSTRAINT_TAB2"."COL1")SQL> insert into test_constraint_tab2 (col1, col2, col3) values ('col1_1', null, 'col3_1');insert into test_constraint_tab2 (col1, col2, col3) values ('col1_1', null, 'col3_1') *第 1 行出现错误:ORA-01400: 无法将 NULL 插入 ("SYS"."TEST_CONSTRAINT_TAB2"."COL2")SQL> insert into test_constraint_tab2 (col1, col2, col3) values (null, 'col2_1', 'col3_1');insert into test_constraint_tab2 (col1, col2, col3) values (null, 'col2_1', 'col3_1') *第 1 行出现错误:ORA-01400: 无法将 NULL 插入 ("SYS"."TEST_CONSTRAINT_TAB2"."COL1")
Unique约束
SQL> alter table test_constraint_tab add constraint unique_object_id unique(object_id);表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------UNIQUE_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');OWNER CONSTRAINT_NAME C TABLE_NAME---------- ------------------------------ - ------------------------------SYS UNIQUE_OBJECT_ID U TEST_CONSTRAINT_TABSQL> alter table test_constraint_tab drop constraint unique_object_id;表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');未选定行SQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');未选定行SQL> create index unique_object_id on test_constraint_tab(object_id);索引已创建。SQL> alter table test_constraint_tab add constraint unique_object_id unique(object_id);表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------UNIQUE_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');OWNER CONSTRAINT_NAME C TABLE_NAME------------ ------------------------------ - ------------------------------SYS UNIQUE_OBJECT_ID U TEST_CONSTRAINT_TABSQL> alter table test_constraint_tab drop constraint unique_object_id;表已更改。SQL> select index_name, index_type, table_name, table_owner from user_indexes where table_name = upper('test_constraint_tab');INDEX_NAME INDEX_TYPE TABLE_NAME TABLE_OWNER------------------------------ --------------------------- ------------------------------ ------------------------------UNIQUE_OBJECT_ID NORMAL TEST_CONSTRAINT_TAB SYSSQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name = upper('test_constraint_tab');未选定行
可以看出创建Unique约束后在约束列也会自动创建索引,而且删除约束后索引也自动删除。先创建索引后可以创建同名的unique约束,但是删除约束后索引不会自动被删除。同样,存在unique约束无法删除其对应的索引。
SQL> drop index unique_object_id;drop index unique_object_id *第 1 行出现错误:ORA-02429: 无法删除用于强制唯一/主键的索引Unique约束允许包含的列存在NULL值
SQL> alter table test_constraint_tab2 add constraint unique_col3 unique(col3);表已更改。SQL> insert into test_constraint_tab2 (col1, col2, col3) values ('col1_1', 'col2_1', null);已创建 1 行。SQL> insert into test_constraint_tab2 (col1, col2, col3) values ('col1_2', 'col2_2', null);已创建 1 行。此外Oracle不允许在相同的列上既创建Primary Key约束又创建Unique约束。
阅读全文
0 0
- Oracle学习笔记(四)——Primary Key&Unique约束
- oracle约束总结(not null/unique/primary key/foreign key/check)
- oracle中五中约束详解(CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY,NOT NULL)
- SQLite学习笔记六: 约束NOT NULL,DEFAULT,UNIQUE,PRIMARY KEY, CHECK
- UNIQUE 约束和 PRIMARY KEY 约束
- 学习笔记--mysql索引(一) 索引使用,index,key,primary key, unique
- oracle的完整性约束:check/not null/unique/primary/foreign key
- SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
- oracle的primary key主键约束
- primary key 与 unique 约束的区别与作用
- SQLite 约束NOT NULL,DEFAULT,UNIQUE,PRIMARY KEY, CHECK
- 慕课学习之mysql笔记:primary key与unique key
- 第五章、数据库设计(三范式、主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
- oracle primary key和unique key的区别与联系
- Oracle primary key和unique key的区别与联系
- Oracle primary key和unique key的区别与联系
- primary key与unique
- PRIMARY KEY 与 UNIQUE
- java 基础 知识整理
- UESTC 1709 DNA序列 AC自动机+dp+矩阵快速幂优化
- 转载:快与品质没有关系
- 内部类
- Java基础---super关键字,方法重写 ,instanceof关键字
- Oracle学习笔记(四)——Primary Key&Unique约束
- 808C
- 动态游标使用例子
- [AHK]随叫随到的记事本
- [日常训练] 坦克
- WWW在unity中的简单应用实践
- Adapter
- JAVA8 hashmap源码阅读笔记(红黑树链表)
- jekyll在ubuntu上的安装部署