`
271788203
  • 浏览: 490080 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

unique index and constraint

 
阅读更多

1. 测试unique index 和 unique constraint

SYS@anqing2(rac2)> create table ut(idnumber,phone varchar2(15),name varchar2(15));

Table created. 

SYS@anqing2(rac2)> insert into utvalues(1,'13888888888','dave');

1 row created.

SYS@anqing2(rac2)> insert into utvalues(1,'13888888888','dave');

1 row created.

SYS@anqing2(rac2)> insert into utvalues(2,'13899999999','dba');

1 row created.

SYS@anqing2(rac2)> commit;

Commit complete.

 

--在phone 字段上,我们创建uniqueconstraint

SYS@anqing2(rac2)> alter table ut addconstraint uc_phone unique(phone);

alter table ut add constraint uc_phoneunique(phone)

                              *

ERROR at line 1:

ORA-02299: cannot validate (SYS.UC_PHONE) -duplicate keys found

--这里报错,因为我们在插入数据的时候,有重复值,先删除掉重复值

 

SYS@anqing2(rac2)> select * from ut;

 

       ID PHONE           NAME

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

        1 13888888888     dave

        2 13899999999     dba

        1 13888888888     dave

 

SYS@anqing2(rac2)> delete from ut whererownum=1;

1 row deleted.

 

SYS@anqing2(rac2)> commit;

Commit complete.

 

SYS@anqing2(rac2)> select * from ut;

       ID PHONE           NAME

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

        2 13899999999     dba

        1 13888888888     dave

 

--唯一性约束创建成功

SYS@anqing2(rac2)> alter table ut addconstraint uc_phone unique(phone);

Table altered.

 

--查看约束

SYS@anqing2(rac2)> selectconstraint_name,constraint_type,table_name,index_owner,index_name fromuser_constraints where table_name = 'UT';

 

CONSTRAINT_NAME C TABLE_NAME  INDEX_OWNER  INDEX_NAME

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

UC_PHONE        U UT            SYS           UC_PHONE

--Oracle 自动创建了索引并关联到约束, 索引名和约束名是相同的。

 

--验证下索引

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

 

INDEX_NAME    INDEX_TYPE    UNIQUENES GENERATED

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

UC_PHONE      NORMAL        UNIQUE    N

--我们并没有创建索引,而是在创建unique constraint时,oracle 强制创建了uniqueindex。

 

--现在我们drop index 看看

SYS@anqing2(rac2)> drop index uc_phone;

drop index uc_phone

          *

ERROR at line 1:

ORA-02429: cannot drop index used forenforcement of unique/primary key

--这里报错,不能删除unique/primary key 上的索引。在这种情况下,我们只有先删除约束。

 

SYS@anqing2(rac2)> alter table ut dropconstraint uc_phone;

Table altered.

 

SYS@anqing2(rac2)> drop index uc_phone;

drop index uc_phone

          *

ERROR at line 1:

ORA-01418: specified index does not exist

--再次drop 索引时,提示索引已经不存在,说明已经在删除约束的同时,把索引删掉了。

 

SYS@anqing2(rac2)> selectconstraint_name,constraint_type,table_name,index_owner,index_name fromuser_constraints where table_name = 'UT';

no rows selected

 

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

no rows selected

 

结论:

       当约束列上没有索引时,在创建unique constraint 时,oracle 会自动创建unique index,并且该索引不能删除,当删除unique constraint 时,unique index 会自动删除。

 

 

2. 测试unique constraint 和non-unique index

 

--现在字段phone上创建B-Tree索引

SYS@anqing2(rac2)> create indexidx_ut_phone on ut(phone);

Index created.

 

--查看索引

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

INDEX_NAME    INDEX_TYPE    UNIQUENES GENERATED

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

IDX_UT_PHONE  NORMAL       NONUNIQUE N

 

--创建unique constraint

SYS@anqing2(rac2)>  alter table ut add constraint uc_phoneunique(phone);

Table altered.

 

--查看约束和索引信息

SYS@anqing2(rac2)> selectconstraint_name,constraint_type,table_name,index_owner,index_name fromuser_constraints where table_name = 'UT';

 

CONSTRAINT_NAME C TABLE_NAME   INDEX_OWNER  INDEX_NAME

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

UC_PHONE        U UT            SYS           IDX_UT_PHONE

--这里重用了已经存在的索引

 

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

INDEX_NAME    INDEX_TYPE    UNIQUENES GENERATED

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

IDX_UT_PHONE  NORMAL       NONUNIQUE N

 

--删除索引

SYS@anqing2(rac2)> drop indexIDX_UT_PHONE;

drop index IDX_UT_PHONE

          *

ERROR at line 1:

ORA-02429: cannot drop index used forenforcement of unique/primary key

--这个提示和之前的一样,我们先删除约束,在来查看

 

SYS@anqing2(rac2)> alter table ut dropconstraint uc_phone;

Table altered.

 

SYS@anqing2(rac2)> select constraint_name,constraint_type,table_name,index_owner,index_namefrom user_constraints where table_name = 'UT';

no rows selected

--这里约束已经删除掉了。

 

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

INDEX_NAME    INDEX_TYPE    UNIQUENES GENERATED

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

IDX_UT_PHONE  NORMAL       NONUNIQUE N

--但是我们的索引并在删除约束时删除掉

 

--在手工删除索引,成功

SYS@anqing2(rac2)> drop indexIDX_UT_PHONE;

Index dropped.

 

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

no rows selected

 

--重新把约束和索引加上,然后一次删除

SYS@anqing2(rac2)> create indexidx_ut_phone on ut(phone);

Index created.

SYS@anqing2(rac2)> alter table ut addconstraint uc_phone unique(phone);

Table altered.

 

SYS@anqing2(rac2)> selectconstraint_name,constraint_type,table_name,index_owner,index_name fromuser_constraints where table_name = 'UT';

CONSTRAINT_NAME C TABLE_NAME    INDEX_OWNER   INDEX_NAME

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

UC_PHONE        U UT            SYS           IDX_UT_PHONE

 

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

INDEX_NAME    INDEX_TYPE    UNIQUENES GENERATED

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

IDX_UT_PHONE  NORMAL       NONUNIQUE N

 

SYS@anqing2(rac2)> alter table ut drop constraint uc_phone drop index;

Table altered.

SYS@anqing2(rac2)> selectconstraint_name,constraint_type,table_name,index_owner,index_name fromuser_constraints where table_name = 'UT';

no rows selected

SYS@anqing2(rac2)> selectindex_name,index_type,uniqueness,generated from user_indexes wheretable_name='UT';

no rows selected

--索引和约束一次删除

 

 

小结:

       当我们的列上有索引时,在创建unique constraint时,Oracle 会重用之前的索引,并且不会改变索引的类型,在第一个测试里,Oracle 自动创建的索引是unique index。

       当我们删除约束时,关联的索引不会自动删除。 这个问题的MOS 上有说明。 参考MOS [ID309821.1]。

       我们可以分两步,先删除约束,在删除索引。 MOS 提供了方法,就是在删除约束时,加上drop index,这样就能一次搞定。

       SQL>altertable ut drop constraint uc_phone drop index;

分享到:
评论

相关推荐

    ORACLE经典常用语句总结

    C.CONSTRAINT_TYPE, CC.COLUMN_NAME FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC WHERE C.OWNER = UPPER('&table_owner') AND C.TABLE_NAME = UPPER('&table_name') AND C.OWNER = CC.OWNER AND C.CONSTRAINT_...

    Oracle学习笔记大全

    CREATE [UNIQUE] INDEX index_name ON table_name (column,.. ASC/DESC) TABLESPACE tablespace_name [PCTFREE integer] [INITRANS integer] [MAXTRANS integer] [LOGGING | NOLOGGING] [NOSORT] STORAGE(INITIAL ...

    详细oracle笔记1

    AND c.owner = cc.owner AND c.constraint_name = cc.constraint_name ORDER BY cc.position; ``` 5. **删除主键或外键**: 删除约束的命令是: ```sql ALTER TABLE table_name DROP CONSTRAINT key_name; ...

    微软内部资料-SQL性能优化5

    Each index row in node pages contains an index key (or set of keys for a composite index) and a pointer to a page at the next level for which the first key value is the same as the key value in the ...

    bbs论坛项目运用SSH框架Oracle数据库编写的一个简单示列项目

    -- Create/Recreate primary, unique and foreign key constraints alter table USERS add constraint PK_USERID primary key (USERID) using index tablespace SYSTEM pctfree 10 initrans 2 maxtrans 255 ...

    Oracle常见语句

    CREATE [UNIQUE] INDEX index_name ON table_name (column,... ASC/DESC) TABLESPACE tablespace_name [PCTFREE integer] [INITRANS integer] [MAXTRANS integer] [LOGGING | NOLOGGING] [NOSORT] STORAGE (INITIAL ...

    oracle笔记二--plsql 编程.txt

    WHERE C.OWNER = UPPER('&table_owner') AND C.TABLE_NAME = UPPER('&table_name') AND C.OWNER = CC.OWNER AND C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME ORDER BY CC.POSITION; ``` **5. 删除约束** 当不再需要...

    oracle优化笔记

    c.constraint_type, cc.column_name from user_constraints c, user_cons_columns cc where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_...

    如何在oracle中查询所有用户表的表名、主键名称、索引、外键等

    AND au.constraint_type = 'P' AND au.table_name = '表名'; ``` #### 解析: 这段SQL语句用于查询特定表的主键信息。`user_cons_columns` 表记录了约束所涉及的列信息,`user_constraints` 表则包含了约束本身的...

    ORACLE经典常用语句

    CREATE [UNIQUE] INDEX index_name ON table_name (column, .. ASC/DESC) TABLESPACE tablespace_name [PCTFREE integer] [INITRANS integer] [MAXTRANS integer] [LOGGING|NOLOGGING] [NOSORT] STORAGE (initial ...

    用SQL语句创建表表的连接等实验操作

    constraint SageCK CHECK (Sage > 0 AND Sage ) ); ``` - **Sno**:学号,主键,不允许为空。 - **Sname**:姓名,唯一性约束。 - **Ssex**:性别,默认值为0。 - **Sage**:年龄,范围检查约束,确保年龄在0到100...

    xtree java 异步 树 demo

    xtree java异步加载树demo 环境:myeclipse6.5+jdk1.5+tomcat5.5+...-- Create/Recreate primary, unique and foreign key constraints alter table APPMENU add constraint PK_APPMENU primary key (APPMENUID);

    数据库基本操作

    create unique index kczccj_index on 成绩 (课程编号) go ``` - **创建唯一索引**:在`成绩`表上创建了一个名为`kczccj_index`的唯一索引,基于`课程编号`字段。 - **查看索引信息**: ```sql exec sp_...

    Oracle总结,常见面试题

    constraint emp_check2 check(age>=18 and age) ); ``` 7. **表关系及字段的操作**:对表结构进行操作,如删除表、删除约束、添加字段和约束: ``` drop table emp; -- 删除表 alter table emp drop ...

    T-SQL数据库学习笔记

    CREATE UNIQUE INDEX 選_idx ON 選 (学 ASC, γ号 DESC); ``` ### 7. 创建视图 (CREATE VIEW) 视图是一种虚拟表,它的结果集是由存储在基本表中的数据通过SELECT语句导出的。创建视图可以简化复杂的查询并提供对...

    数据库基础出自本人亲手制作,11个字好难凑啊

    tname VARCHAR(6), tage INT(3), tdate DATE NOT NULL, CONSTRAINT pk_tno PRIMARY KEY(tno), CONSTRAINT uk_tname UNIQUE(tname), CONSTRAINT check_tage CHECK(tage BETWEEN 0 AND 250))`,创建了一个包含主键、...

    sql实用学习手册

    索引(INDEX)是提高查询性能的关键,创建唯一索引 `create unique index id_index on aa (id desc, name asc)` 可以加速特定查询。最后,`GETDATE()` 函数返回当前日期和时间,`DATEPART()` 用于提取日期或时间的...

    SQL sever 实训

    CREATE UNIQUE INDEX IX_SaleDate ON ProOut(SaleDate) GO --单元九 语言编程基础 --计算有多少种产品(假设为x),然后显示一条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) ...

    Oracle事例

    and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 5、删除主键或外键 alter table TABLE_NAME drop constraint KEY_NAME; 6、建外键 单字段时:create table 表名...

    SQL ROW_NUMBER()分页比较

    CREATE UNIQUE NONCLUSTERED INDEX [Inx_Name] ON [dbo].[Users] ( [Name] ASC ) ON [PRIMARY] DECLARE @index INT SET @index=0 WHILE @index BEGIN INSERT INTO Users(Name,test) values(@index,'walkingp') ...

Global site tag (gtag.js) - Google Analytics