Sql 如何编写查询以获取表的所有列并检查其是否有主键?
我想知道一列是否有主键,所以我加入了Sql 如何编写查询以获取表的所有列并检查其是否有主键?,sql,oracle,Sql,Oracle,我想知道一列是否有主键,所以我加入了user\u tab\u cols和user\u constraints来获取查询的类型,如果一列的类型为class='p',则结果为1 我正在编写一个查询,从user\u tab\u cols(用于连接表和列名),user\u constraints(用于获取列的类型和约束的名称) 我的问题是我得到了重复的列,表tab1有10列,我得到了20列结果(重复),我知道这是因为我需要将这两个列都连接起来,但如果我这样做,我只得到3行(因为用户约束只包含3行) 如何
user\u tab\u cols
和user\u constraints
来获取查询的类型,如果一列的类型为class='p',则结果为1
我正在编写一个查询,从user\u tab\u cols
(用于连接表和列名),user\u constraints
(用于获取列的类型和约束的名称)
我的问题是我得到了重复的列,表tab1有10列,我得到了20列结果(重复),我知道这是因为我需要将这两个列都连接起来,但如果我这样做,我只得到3行(因为用户约束只包含3行)
如何编写查询以获取表中的所有列,并检查其是否有主键?如果您希望源表中的所有列,并且缺少
user\u cons\u columns
视图以获取应用于哪个列的约束,则需要使用左连接
试着这样做:
select cols.table_name
, cols.column_name
, col_cons.constraint_name
, usr_cons.constraint_type
from user_tab_columns cols
left join user_cons_columns col_cons
on col_cons.table_name = cols.table_name
and col_cons.column_name = cols.column_name
left join user_constraints usr_cons
on usr_cons.table_name = cols.table_name
and usr_cons.constraint_name = col_cons.constraint_name
where cols.table_name = 'YOUR_TABLE_NAME_HERE'
order by cols.column_name
;
对于没有任何类型约束的列,您将得到null,如果您有复合约束,则对于多个列,可能会得到相同的约束名称/类型
如果某些列受多个约束(例如,主键的一部分也有外键约束),则它们也会有多行
create table bar (a int primary key);
create table foo (a int, b int, c int
, constraint foo_pk primary key (a,b)
, constraint foo_fk foreign key(a) references bar(a));
select cols.table_name
, cols.column_name
, col_cons.constraint_name
, usr_cons.constraint_type
from user_tab_columns cols
left join user_cons_columns col_cons
on col_cons.table_name = cols.table_name
and col_cons.column_name = cols.column_name
left join user_constraints usr_cons
on usr_cons.table_name = cols.table_name
and usr_cons.constraint_name = col_cons.constraint_name
order by table_name, column_name
;
谢谢您的查询,但是如何指定表名呢?只需像您通常会做的那样,在联接之后添加
where cols.table_name='XXX'
(在order by
之前)。啊,是的,我添加了,它给了我不同的结果。无论如何,谢谢。
create table bar (a int primary key);
create table foo (a int, b int, c int
, constraint foo_pk primary key (a,b)
, constraint foo_fk foreign key(a) references bar(a));
select cols.table_name
, cols.column_name
, col_cons.constraint_name
, usr_cons.constraint_type
from user_tab_columns cols
left join user_cons_columns col_cons
on col_cons.table_name = cols.table_name
and col_cons.column_name = cols.column_name
left join user_constraints usr_cons
on usr_cons.table_name = cols.table_name
and usr_cons.constraint_name = col_cons.constraint_name
order by table_name, column_name
;
TABLE_NAME COLUMN_NAME CONSTRAINT_NAME CONSTRAINT_TYPE
------------------------------ ------------------------------ ------------------------------ ---------------
BAR A SYS_C007382 P
FOO A FOO_FK R
FOO A FOO_PK P
FOO B FOO_PK P
FOO C