【问题标题】:How to get primary key column in Oracle?如何在 Oracle 中获取主键列?
【发布时间】:2017-05-24 19:50:06
【问题描述】:

我需要获取主键列的名称。

在输入中,我只有表名。

【问题讨论】:

    标签: oracle


    【解决方案1】:
    SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
    FROM all_constraints cons, all_cons_columns cols
    WHERE cols.table_name = 'TABLE_NAME'
    AND cons.constraint_type = 'P'
    AND cons.constraint_name = cols.constraint_name
    AND cons.owner = cols.owner
    ORDER BY cols.table_name, cols.position;
    

    确保“TABLE_NAME”为大写,因为 Oracle 以大写形式存储表名。

    【讨论】:

    • 谢谢,里奇。还有一个问题:如何编码 'P' ?我需要使用“立即执行”来执行此操作。再次感谢。
    • 我想你会像这样 ''P'' 把两个单引号括起来
    • 或者,您可以使用quote it q
    • 和 constraint_type = 'R' 表示外键
    • 在表格前没有架构前缀时为我工作!谢谢!
    【解决方案2】:

    与“Richie”的答案相同,但更简洁一些。

    1. 仅查询用户约束

      SELECT column_name FROM all_cons_columns WHERE constraint_name = (
        SELECT constraint_name FROM user_constraints 
        WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
      );
      
    2. 查询所有约束

      SELECT column_name FROM all_cons_columns WHERE constraint_name = (
        SELECT constraint_name FROM all_constraints 
        WHERE UPPER(table_name) = UPPER('tableName') AND CONSTRAINT_TYPE = 'P'
      );
      

    【讨论】:

    • @FearlessFuture 对我来说效果很好。你能把你的问题描述得更有表现力吗?
    • 我没有从这个查询中得到任何结果,但我确实从接受答案的查询中得到了结果。
    • @FearlessFuture 我假设您正在搜索的约束不是用户约束。将user_constraints 替换为all_constraints
    • 如果您在两个或多个模式中有一个同名的表,这会导致麻烦 - 还需要在联接中包括所有者:SELECT owner, column_name, position FROM all_cons_columns WHERE (owner, constraint_name) in (SELECT owner, constraint_name FROM all_constraints WHERE UPPER(table_name) = UPPER('&tableName') AND CONSTRAINT_TYPE = 'P') order by owner, position;
    • @MarkStewart 我同意第二个查询不起作用。但是您的解决方案效率低下。尝试:“SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name as KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints cons, user_cons_columns cols WHERE cons.constraint_name = cols.constraint_name and CONSTRAINT_TYPE = 'P' and cons.table_name = '' 和 cons.table_name = cols.table_name;"
    【解决方案3】:
    Select constraint_name,constraint_type from user_constraints where table_name** **= ‘TABLE_NAME’ ;
    

    (这将列出主键,然后)

    Select column_name,position from user_cons_cloumns where constraint_name=’PK_XYZ’; 
    

    (这将为您提供列,这里 PK_XYZ 是主键名称)

    【讨论】:

      【解决方案4】:

      试试这个代码 这里我在oracle中创建了一个获取主键列的表,称为test然后查询

      create table test
      (
      id int,
      name varchar2(20),
      city varchar2(20),
      phone int,
      constraint pk_id_name_city primary key (id,name,city)
      );
      
      SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner FROM all_constraints cons, all_cons_columns cols WHERE cols.table_name = 'TEST' AND cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner  ORDER BY cols.table_name, cols.position;
      

      【讨论】:

        【解决方案5】:

        将以下脚本另存为 findPK.sql 之类的文件。

        set verify off
        accept TABLE_NAME char prompt 'Table name>'
        
        SELECT cols.column_name
        FROM all_constraints cons NATURAL JOIN all_cons_columns cols
        WHERE cons.constraint_type = 'P' AND table_name = UPPER('&TABLE_NAME');
        

        然后可以使用调用它

        @findPK
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多