¿Cómo obtener la columna de clave principal en Oracle?


107

Necesito obtener el nombre de la columna de clave principal.

En la entrada, solo tengo el nombre de la tabla.

Respuestas:


190
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;

Asegúrese de que 'TABLE_NAME' esté en mayúsculas ya que Oracle almacena los nombres de las tablas en mayúsculas.


Gracias, Richie. Una pregunta más: ¿cómo codificar 'P'? Necesito ejecutar esto con "EXECUTE INMEDIATE". gracias de nuevo.
Kirill A.

4
Creo que solo pondrías dos comillas simples como esta '' P ''
Greg Reynolds

Alternativamente, puede citarlo usando q.
Burhan Ali

y constraint_type = 'R' para clave externa
Abinash Bishoyi

¡Funcionó para mí cuando no tenía el prefijo de esquema antes de la mesa! ¡Gracias!
FearlessFuture

20

Igual que la respuesta de 'Richie' pero un poco más concisa.

  1. Consulta solo para restricciones de usuario

    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. Consultar todas las restricciones

    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 Para mí funcionó bien. ¿Puede describir su problema un poco más expresivo?
Mi nombre es

No obtengo ningún resultado de esta consulta, pero obtengo resultados de la consulta de la respuesta aceptada.
FearlessFuture

2
@FearlessFuture Supongo que la restricción que está buscando no es una restricción de usuario. Reemplazar user_constraintspor all_constraints.
Mi nombre es

Esto causa problemas si tiene una tabla con el mismo nombre en dos o más esquemas; debe incluir también al propietario en la combinación: 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;
Mark Stewart

1
@MarkStewart Estoy de acuerdo con que la segunda consulta no funcionará. Pero tu solución es ineficaz. Pruebe: "SELECT cols.column_name AS KEY_STREAM, '=' AS KEY_CONDITION, cols.column_name como KEY_LOOKUP, '' AS KEY_STREAM2 FROM user_constraints cons, user_cons_columns cols WHERE cons.constraint_name = cols.constraint_name 'y CONSTRAINT_name = '<TABLE_NAME>' y cons.table_name = cols.table_name; "
Alexander Heim

2
Select constraint_name,constraint_type from user_constraints where table_name** **= TABLE_NAME ;

(Esto mostrará la clave principal y luego)

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

(Esto le dará la columna, aquí PK_XYZ es el nombre de la clave principal)


1

Pruebe este código aquí Creé una tabla para obtener la columna de clave principal en Oracle que se llama prueba y luego consulta

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;

0

Guarde el siguiente script como algo como 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');

Luego se puede llamar usando

@findPK
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.