Published on

February 2, 2018

Comprendiendo las claves primarias compuestas en SQL Server

Cuando se trabaja con bases de datos, es común tener tablas con claves primarias que identifican de manera única cada fila. Normalmente, una clave primaria es una sola columna, pero hay casos en los que se requiere una clave primaria compuesta que consiste en dos o más columnas. En este artículo, exploraremos el concepto de claves primarias compuestas en SQL Server y cómo trabajar con ellas de manera eficiente.

¿Qué es una clave primaria compuesta?

Una clave primaria compuesta es una clave primaria que está compuesta por dos o más columnas. Proporciona la misma funcionalidad que una clave primaria singular, pero permite representar relaciones de datos más complejas en la base de datos. Por ejemplo, en una tabla que almacena órdenes, una clave primaria compuesta podría consistir en el ID de la orden y el ID del cliente, asegurando que cada orden esté identificada de manera única por ambos el ID de la orden y el ID del cliente.

Determinando el número de columnas en una clave primaria compuesta

En SQL Server, puedes utilizar las vistas de administración dinámica del sistema (DMVs, por sus siglas en inglés) junto con la función COL_NAME para determinar el número de columnas que componen una clave primaria. La siguiente consulta se puede utilizar para obtener esta información:

SELECT SCHEMA_NAME(o.schema_id) AS 'Esquema',
       OBJECT_NAME(i.object_id) AS 'NombreTabla',
       COUNT(COL_NAME(ic.object_id,ic.column_id)) AS 'CantidadColumnasClavePrimaria'
FROM sys.indexes i 
    INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
    INNER JOIN sys.objects o ON i.object_id = o.object_ID
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE i.is_primary_key = 1
    AND o.type_desc = 'USER_TABLE'
GROUP BY OBJECT_NAME(i.object_id), o.schema_id
HAVING COUNT(1) > 1
ORDER BY 1

Esta consulta te proporcionará un conjunto de resultados que incluye el nombre del esquema, el nombre de la tabla y el número de columnas en la clave primaria compuesta.

Recuperando las columnas de una clave primaria compuesta

Para recuperar las columnas que componen una clave primaria compuesta, puedes utilizar la función STUFF junto con XML PATH para generar una lista separada por comas de los nombres de las columnas. Aquí tienes un ejemplo de consulta:

SELECT SCHEMA_NAME(o.schema_id) AS 'Esquema',
       OBJECT_NAME(i2.object_id) AS 'NombreTabla',
       STUFF(
       (SELECT ',' + COL_NAME(ic.object_id,ic.column_ID) 
        FROM sys.indexes i1
        INNER JOIN sys.index_columns ic ON i1.object_id = ic.object_id AND i1.index_id = ic.index_id
        WHERE i1.is_primary_key = 1
        AND i1.object_id = i2.object_id AND i1.index_id = i2.index_id
        FOR XML PATH('')),1,1,'') AS PK
FROM sys.indexes i2
    INNER JOIN sys.objects o ON i2.object_id = o.object_id
WHERE i2.is_primary_key = 1
    AND o.type_desc = 'USER_TABLE'

Esta consulta devolverá un conjunto de resultados que incluye el nombre del esquema, el nombre de la tabla y una lista separada por comas de las columnas que componen la clave primaria compuesta.

Poniéndolo todo junto

Para obtener un conjunto de resultados unificado que incluya tanto el número de columnas como los nombres de las columnas de la clave primaria compuesta, puedes utilizar una expresión de tabla común (CTE, por sus siglas en inglés) para combinar las dos consultas. Aquí tienes un ejemplo:

;WITH mycte AS (
SELECT SCHEMA_NAME(o.schema_id) AS 'Esquema',
       OBJECT_NAME(i2.object_id) AS 'NombreTabla',
       STUFF(
       (SELECT ',' + COL_NAME(ic.object_id,ic.column_id) 
        FROM sys.indexes i1
        INNER JOIN sys.index_columns ic ON i1.object_id = ic.object_id AND i1.index_id = ic.index_id
        WHERE i1.is_primary_key = 1
        AND i1.object_id = i2.object_idAND i1.index_id = i2.index_id
        FOR XML PATH('')),1,1,'') AS PK
FROM sys.indexes i2
    INNER JOIN sys.objects o ON i2.object_id = o.object_id
WHERE i2.is_primary_key = 1
    AND o.type_desc = 'USER_TABLE'
)
SELECT SCHEMA_NAME(o.schema_id) AS 'Esquema',
       OBJECT_NAME(i.object_id) AS 'NombreTabla',
       COUNT(COL_NAME(ic.object_id,ic.column_id)) AS 'CantidadColumnasClavePrimaria',
       mycte.PK AS 'ColumnasClavePrimaria'
FROM sys.indexes i 
    INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
    INNER JOIN sys.objects o ON i.object_id = o.object_id
    INNER JOIN mycte ON mycte.NombreTabla = OBJECT_NAME(i.object_id)
WHERE i.is_primary_key = 1
    AND o.type_desc = 'USER_TABLE'
GROUP BY SCHEMA_NAME(o.schema_id),
         OBJECT_NAME(i.object_id),
         mycte.PK
HAVING COUNT('CantidadColumnasClavePrimaria') > 1
ORDER BY 'NombreTabla' ASC

Esta consulta final proporcionará un conjunto de resultados limpio y unificado que incluye el nombre del esquema, el nombre de la tabla, el número de columnas en la clave primaria compuesta y los nombres de las columnas.

Conclusión

Comprender las claves primarias compuestas y cómo trabajar con ellas de manera eficiente es esencial al trabajar con bases de datos. Utilizando las técnicas descritas en este artículo, puedes determinar fácilmente el número de columnas y recuperar los nombres de las columnas de una clave primaria compuesta en SQL Server. Este conocimiento te ayudará a crear procesos y escribir consultas SQL dinámicas que involucren claves primarias compuestas.

No dudes en descargar el script completo desde el enlace proporcionado en el artículo y explorar más a fondo.

¡Feliz codificación!

© 2021 Tu Nombre. Todos los derechos reservados.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.