Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何编写查询以获取表的所有列并检查其是否有主键?_Sql_Oracle - Fatal编程技术网

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