2015-02-09 88 views
3

我正在从UI实现一个搜索功能,为此我想列出具有唯一约束的列名以及任何主键列(如果存在),以便用户可以使用任何这些所选列相关数据。我已经寻找这样的查询,但没有发现从oracle数据库获取唯一的约束列名

喜欢的东西:

SELECT COLUMN_NAMEs FROM TABLE WHERE CONSTRAINTS UNIQUE OR PRIMARY 

有任何查询,以实现这一目标?

回答

2

你需要看看USER_CONS_COLUMNS视图。为了得到constraint_type,你可以加入USER_CONSTRAINTS

SQL> desc user_cons_columns; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
OWNER          NOT NULL VARCHAR2(128) 
CONSTRAINT_NAME       NOT NULL VARCHAR2(128) 
TABLE_NAME        NOT NULL VARCHAR2(128) 
COLUMN_NAME          VARCHAR2(4000) 
POSITION           NUMBER 

SQL> 

例如,

SQL> column owner format a6 
SQL> column constraint_name format a10 
SQL> column table_name format a10 
SQL> column column_name format a10 
SQL> SELECT A.owner, 
    2 A.constraint_name, 
    3 A.table_name, 
    4 A.column_name, 
    5 b.constraint_type 
    6 FROM user_cons_columns A, 
    7 user_constraints b 
    8 WHERE A.owner  =b.owner 
    9 AND A.constraint_name=b.constraint_name 
10 AND A.table_name  =b.table_name; 

OWNER CONSTRAINT TABLE_NAME COLUMN_NAM C 
------ ---------- ---------- ---------- - 
SCOTT FK_DEPTNO EMP  DEPTNO  R 
SCOTT PK_DEPT DEPT  DEPTNO  P 
SCOTT PK_EMP  EMP  EMPNO  P 

SQL> 
6

USER_CONSTRAINTS也将返回外键。您只需要主键和唯一键。但独特性也可以通过独特的索引来实现。它不会显示在约束列表中。您需要观看USER_INDEXES视图。好处在于主键和唯一键创建相应的唯一索引。所以,检查USER_INDEXES是必要的和足够的。

UPD:见Lalit Kumar B的评论。

select c.COLUMN_NAME 
from USER_INDEXES i, USER_IND_COLUMNS c 
where i.TABLE_NAME = 'YOUR_TABLE' 
    and i.UNIQUENESS = 'UNIQUE' 
    and i.TABLE_NAME = c.TABLE_NAME 
    and i.INDEX_NAME = c.INDEX_NAME 
union 
select cc.COLUMN_NAME 
from USER_CONSTRAINTS con, USER_CONS_COLUMNS cc 
where con.TABLE_NAME = 'YOUR_TABLE' 
    and con.CONSTRAINT_TYPE in ('U', 'P') 
    and con.TABLE_NAME = cc.TABLE_NAME 
    and con.CONSTRAINT_NAME = cc.CONSTRAINT_NAME 
+1

*好处在于主键和唯一键创建相应的唯一索引。 *不一定,如果Oracle找到列上已存在的索引(不论其是否唯一),它就会使用它。 – 2015-02-09 07:18:02

+0

@Lalit库马尔乙:是的,你说得对。谢谢!我会编辑我的答案。我们需要同时使用唯一索引和主键/唯一键。 – Qualtagh 2015-02-09 11:17:12