Oracle中索引名称的唯一性

Posted 池的巧克力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中索引名称的唯一性相关的知识,希望对你有一定的参考价值。

数据库索引处理是遇到的一点问题,简单记录下

 

oracle的规定,在同一个SCHEMA下的对象是不能用相同的名字命名的,一般创建索引名用“表名_字段名”,这样能很快知道这个索引,是属于哪个表的。

col_index 在ORACLE中都叫对象,不能命名相同

例:

  1. SQL> create table emp1 as select * from scott.emp;  
  2.    
  3. Table created  
  4.    
  5. SQL> create table emp2 as select * from scott.emp;  
  6.    
  7. Table created  
  8.    
  9. SQL> create index emp1_name_idx on emp1(ename);  
  10.    
  11. Index created  
  12.    
  13. SQL> create index emp1_name_idx on emp2(ename);  
  14.    
  15. create index emp1_name_idx on emp2(ename)  
  16.    
  17. ORA-00955: 名称已由现有对象使用 

转载下schema的解析,源自   http://blog.csdn.net/kimsoft/article/details/4627520

 

我们先来看一下他们的定义:
A schema is a collection of database objects (used by a user.).
Schema objects are the logical structures that directly refer to the database’s data.
A user is a name defined in the database that can connect to and access objects.
Schemas and users help database administrators manage database security.

从 定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类 似用户名的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。

一 个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。这也就是我们在企业管理器的方案下看到schema 名都为数据库用户名的原因。Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(Oracle 中虽然有create schema语句,但是它并不是用来创建一个schema的),在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省 shcema。即schema的个数同user的个数相同,而且schema名字同user名字一一 对应并且相同,所有我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。

一个用户有一个缺省的 schema,其schema名就等于用户名,当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中 的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象 的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创 建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。

咳,说了这么多,给大家举个例子,否则,一切枯燥无味!
SQL> Gruant dba to scott

SQL> create table test(name char(10));
Table created.

SQL> create table system.test(name char(10));
Table created.

SQL> insert into test values(‘scott‘);
1 row created.

SQL> insert into system.test values(‘system‘);
1 row created.

SQL> commit;
Commit complete.

SQL> conn system/manager
Connected.

SQL> select * from test;
NAME
----------
system

SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改变用户缺省schema名
Session altered.

SQL> select * from test;
NAME
----------
scott

SQL> select owner ,table_name from dba_tables where table_name=upper(‘test‘);
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT TEST
SYSTEM TEST
--上面这个查询就是我说将schema作为user的别名的依据。实际上在使用上,shcema与user完全一样,没有什么区别,在出现schema名的地方也可以出现user名。




















































以上是关于Oracle中索引名称的唯一性的主要内容,如果未能解决你的问题,请参考以下文章

oracle怎么把索引改成唯一索引

MySQL唯一索引有重复值且不是bug的场景

oracle 唯一约束 为啥 唯一索引

oracle 数据库中主键索引和唯一索引有啥区别

在oracle数据库中普通索引和唯一索引,请问哪个效率更高?

Oracle数据库主键约束与唯一索引有啥区别?