2011-05-24 20 views
7

¿Es esta la mejor manera de: obtener una lista de todas las claves principales en una base de datos o hay algo mejor?Obtener una lista de todas las claves primarias en una base de datos

SELECT 
KCU.TABLE_NAME AS Table_Name, 
KCU.CONSTRAINT_NAME AS Constraint_Name, 
KCU.COLUMN_NAME AS COLUMN_NAME 
FROM 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU 
ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA 
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA 
AND KCU.TABLE_NAME = TC.TABLE_NAME 
WHERE 
TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
ORDER BY 
KCU.TABLE_SCHEMA, KCU.TABLE_NAME, KCU.CONSTRAINT_NAME 
+2

Por favor, elija un título mejor. ¿A qué te refieres con "mejor"? –

+0

Probablemente también podría usar @@ Identity, pero no sé si eso está cerca de lo que quiere decir. – Ruben

+0

@cularis - RE: La edición de etiqueta propuesta 'INFORMATION_SCHEMA' definitivamente no implica' MySQL'. Estas son vistas portátiles. –

Respuesta

4

mirada en link

EXEC sp_pkeys '<tablename>' 
EXEC sp_helpconstraint '<tablename>' 

sp_pkeys devolverá una fila para cada columna que participa en la clave principal para . Las columnas que probablemente le interesan más en COLUMN_NAME y PK_NAME.

sp_helpconstraint mostrará todas las restricciones , incluidas las claves externas que hacen referencia a la tabla. En el primer conjunto de registros, habrá solo una columna llamada Nombre de objeto (algo así como inútil, ya que eso es lo que pasó ). En el segundo conjunto de resultados , se encontrarán las siguientes columnas : tipo_confianza, nombre_constricción y claves_contención.

+5

por qué es ésta la respuesta, sólo lo hace para una tabla, no una base de datos, que era el punto original de la pregunta –

+1

El enlace al que se hace referencia aquí no es válido – mjenkins

29
USE databasename; 

GO 

SELECT i.name AS IndexName, OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
     COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic 
ON i.OBJECT_ID = ic.OBJECT_ID 
AND i.index_id = ic.index_id 
WHERE i.is_primary_key = 1 

Esta consulta se va a extraer las todas las restricciones de clave principal de la base de datos ... u sólo tiene que ejecutar esta consulta y escriba el nombre de base de datos en la primera línea

0

Si usted está haciendo esto desde Java también puede usar el método getPrimaryKeys en el objeto databasemetadata. Quizás otros idiomas tengan formas similares de hacerlo.

6

La siguiente sintaxis le proporciona todas las restricciones en la base de datos en uso.

select * from sys.key_constraints; 
+3

Para agregar a una respuesta de @Ashraf, puede usar 'seleccionar OBJECT_NAME (parent_object_id), * desde sys.key_constraints donde escriba = 'PK''. Esto le dará el nombre de la tabla y sus nombres de clave principal para las tablas que tienen una clave principal. – nam

1

Si desea que la información de tipo de datos, así:

SELECT 
    so.name 'Table Name', 
    c.name 'Column Name', 
    t.Name 'Data type', 
    c.max_length 'Max Length', 
    c.precision , 
    c.scale , 
    c.is_nullable, 
    ISNULL(i.is_primary_key, 0) 'Primary Key' 
FROM  
    sys.columns c 
INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id 
LEFT OUTER JOIN 
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
LEFT OUTER JOIN 
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
INNER JOIN 
    sysobjects so ON c.object_id = so.id 
WHERE 
    i.is_primary_key = 1 and 
    so.xtype = 'U' 
Order By 'Table Name', 'Column Name' 
Cuestiones relacionadas