我正在从UI实现一个搜索功能,为此我想列出具有唯一约束的列名以及任何主键列(如果存在),以便用户可以使用任何这些所选列相关数据。我已经寻找这样的查询,但没有发现从oracle数据库获取唯一的约束列名
喜欢的东西:
SELECT COLUMN_NAMEs FROM TABLE WHERE CONSTRAINTS UNIQUE OR PRIMARY
有任何查询,以实现这一目标?
我正在从UI实现一个搜索功能,为此我想列出具有唯一约束的列名以及任何主键列(如果存在),以便用户可以使用任何这些所选列相关数据。我已经寻找这样的查询,但没有发现从oracle数据库获取唯一的约束列名
喜欢的东西:
SELECT COLUMN_NAMEs FROM TABLE WHERE CONSTRAINTS UNIQUE OR PRIMARY
有任何查询,以实现这一目标?
你需要看看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>
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
*好处在于主键和唯一键创建相应的唯一索引。 *不一定,如果Oracle找到列上已存在的索引(不论其是否唯一),它就会使用它。 – 2015-02-09 07:18:02
@Lalit库马尔乙:是的,你说得对。谢谢!我会编辑我的答案。我们需要同时使用唯一索引和主键/唯一键。 – Qualtagh 2015-02-09 11:17:12