A menudo, hay muchas formas de hacer lo mismo (o algo similar) en SQL Server. Recuperar todas las claves principales de una base de datos (o incluso solo la clave principal de una tabla dada) es un buen ejemplo.
Este artículo presenta once enfoques diferentes para recuperar información de clave principal en SQL Server.
Algunos de estos serán más útiles que otros, dependiendo de su situación exacta.
Ejemplo 1:el procedimiento almacenado del sistema sp_pkeys
Si solo desea la clave principal para una tabla determinada, sp_pkeys
El procedimiento almacenado del sistema es probablemente la forma más rápida y sencilla de hacerlo. Para hacer esto, simplemente pase el nombre de la tabla al procedimiento.
Así:
EXEC sp_pkeys Artists;
Resultado (usando salida vertical):
TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId KEY_SEQ | 1 PK_NAME | PK__Artists__25706B50FCD918B1
En este caso solicité la clave principal a los Artistas mesa. Devuelve el nombre de la clave principal ( PK__Artists__25706B50FCD918B1 ), el nombre de la base de datos ( Música ), el nombre de la tabla, el nombre de la columna ( ArtistId ), además de otra información.
Alternativamente, podría haber especificado explícitamente todos los argumentos para obtener el mismo resultado:
EXEC sp_pkeys @table_name = Artists, @table_owner = dbo, @table_qualifier = Music;
Ejemplo 2:la vista del sistema KEY_COLUMN_USAGE
El INFORMATION_SCHEMA.KEY_COLUMN_USAGE
La vista del sistema devuelve una fila para cada columna que está restringida como clave en la base de datos actual. Por lo tanto, también obtendrá claves foráneas devueltas con esta vista.
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
Resultado:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Albums | GenreId | FK_Albums_Genres | | Albums | AlbumId | PK__Albums__97B4BE379FC780BD | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | | Genres | GenreId | PK__Genres__0385057E88BB96F8 | +--------------+---------------+-------------------------------+
Podemos ver que esto devuelve restricciones de todas las tablas. También podríamos agregar un WHERE
cláusula para restringir los resultados a una tabla específica.
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
Resultado:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | +--------------+---------------+-------------------------------+
En estos ejemplos, reduje los resultados a solo aquellas columnas de la vista que me interesan, pero también puede usar el asterisco (*
) comodín para devolver todas las columnas.
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
Resultado (usando salida vertical):
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId ORDINAL_POSITION | 1
Ejemplo 3:la vista del sistema CONSTRAINT_COLUMN_USAGE
Esto es similar al ejemplo anterior. El INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
La vista del sistema devuelve una fila para cada columna en la base de datos actual que tiene una restricción definida en la columna. Como con INFORMATION_SCHEMA.KEY_COLUMN_USAGE
también obtendrá claves foráneas devueltas con esta vista. Sin embargo, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
no se limita solo a restricciones clave.
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE;
Resultado:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Albums | GenreId | FK_Albums_Genres | | Albums | AlbumId | PK__Albums__97B4BE379FC780BD | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | | Genres | GenreId | PK__Genres__0385057E88BB96F8 | +--------------+---------------+-------------------------------+
Puedes usar un WHERE
cláusula para devolver solo una tabla o columna específica:
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE COLUMN_NAME = 'ArtistId';
Resultado:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | +--------------+---------------+-------------------------------+
En este caso, especifiqué un nombre de columna, por lo que devolvió todas las restricciones en las columnas con ese nombre. Resulta que la base de datos usa el mismo nombre de columna en dos tablas diferentes. Uno tiene una restricción de clave externa, el otro una clave principal. Por lo tanto, se devuelven ambas filas.
Nuevamente, puede usar el asterisco (*
) comodín para devolver todas las columnas.
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
Resultado (usando salida vertical):
TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1
En este ejemplo, limité la salida a solo restricciones en una tabla específica.
Ejemplo 4:la vista del sistema CONSTRAINT_TABLE_USAGE
El INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
La vista del sistema devuelve una fila para cada tabla en la base de datos actual que tiene una restricción definida en la tabla.
SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE;
Resultado:
+--------------+-------------------------------+ | TABLE_NAME | CONSTRAINT_NAME | |--------------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | | Albums | FK_Albums_Artists | | Albums | FK_Albums_Genres | +--------------+-------------------------------+
Esta vista no devuelve los nombres de columna en los que se utilizan las restricciones, por lo que podría no ser tan útil para usted, según sus requisitos.
Este es un ejemplo que muestra todos los datos devueltos por esta vista para los Géneros tabla:
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE WHERE TABLE_NAME = 'Genres';
Resultado:
TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Genres CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Genres__0385057E88BB96F8
Ejemplo 5:la vista del sistema TABLE_CONSTRAINTS
El INFORMATION_SCHEMA.TABLE_CONSTRAINTS
la vista del sistema devuelve una fila para cada restricción de tabla en la base de datos actual.
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
Resultado:
+--------------+-------------------------------+-------------------+ | TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE | |--------------+-------------------------------+-------------------| | Artists | PK__Artists__25706B50FCD918B1 | PRIMARY KEY | | Genres | PK__Genres__0385057E88BB96F8 | PRIMARY KEY | | Albums | PK__Albums__97B4BE379FC780BD | PRIMARY KEY | | Albums | FK_Albums_Artists | FOREIGN KEY | | Albums | FK_Albums_Genres | FOREIGN KEY | +--------------+-------------------------------+-------------------+
Esta vista no proporciona el nombre de la columna, pero sí proporciona el tipo de restricción. Por lo tanto, puede restringir los resultados a solo claves principales:
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Resultado:
+--------------+-------------------------------+-------------------+ | TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE | |--------------+-------------------------------+-------------------| | Artists | PK__Artists__25706B50FCD918B1 | PRIMARY KEY | | Genres | PK__Genres__0385057E88BB96F8 | PRIMARY KEY | | Albums | PK__Albums__97B4BE379FC780BD | PRIMARY KEY | +--------------+-------------------------------+-------------------+
Aquí hay un ejemplo que usa un comodín (*
) carácter para devolver todos los datos para las restricciones en los
Artistas
tabla:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Artists';
Resultado:
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists CONSTRAINT_TYPE | PRIMARY KEY IS_DEFERRABLE | NO INITIALLY_DEFERRED | NO
Ejemplo 6:la vista del sistema key_constraints
Las sys.key_constraints
La vista del sistema contiene una fila para cada objeto que es una clave principal o una restricción única. Por lo tanto, podríamos usar el siguiente código para devolver todas las restricciones de clave principal en la base de datos, junto con la tabla relevante para cada clave principal:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+---------+-------------------------------+ | Table | name | |---------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | +---------+-------------------------------+
Por supuesto, puede eliminar el WHERE
cláusula para devolver ambas claves primarias y claves únicas.
El ejemplo anterior usa OBJECT_NAME()
función para devolver el nombre de la tabla principal, en lugar de su object_id. Si no usé el OBJECT_NAME()
función, el resultado se vería así:
SELECT parent_object_id, name FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+--------------------+-------------------------------+ | parent_object_id | name | |--------------------+-------------------------------| | 885578193 | PK__Artists__25706B50FCD918B1 | | 917578307 | PK__Genres__0385057E88BB96F8 | | 949578421 | PK__Albums__97B4BE379FC780BD | +--------------------+-------------------------------+
El
parent_object_id
se devuelve en lugar del nombre del objeto principal. El OBJECT_NAME()
hace que sea mucho más fácil para nosotros entender a qué tabla se aplica cada tecla.
Aquí hay un ejemplo donde uso el comodín (*
) carácter para devolver todas las columnas para la clave principal en los
Álbumes
tabla:
SELECT * FROM sys.key_constraints WHERE type = 'PK' AND OBJECT_NAME(parent_object_id) = 'Albums';
Resultado:
name | PK__Albums__97B4BE379FC780BD object_id | 965578478 principal_id | NULL schema_id | 1 parent_object_id | 949578421 type | PK type_desc | PRIMARY_KEY_CONSTRAINT create_date | 2019-05-02 12:56:06.377 modify_date | 2019-05-02 12:56:06.377 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 unique_index_id | 1 is_system_named | 1 is_enforced | 1
Ejemplo 7:la vista del sistema sys.objects
Los sys.objects
La vista del sistema contiene una fila para cada objeto de ámbito de esquema definido por el usuario que se crea dentro de una base de datos. Por lo tanto, contiene nuestras tablas y claves principales.
Podemos tomar la consulta anterior y reemplazar key_constraints
con objects
y obtendremos el mismo resultado:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name FROM sys.objects WHERE type = 'PK';
Resultado:
+---------+-------------------------------+ | Table | name | |---------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | +---------+-------------------------------+
Aquí hay un ejemplo que devuelve todos los datos para PK__Genres__0385057E88BB96F8 clave principal:
SELECT * FROM sys.objects WHERE name = 'PK__Genres__0385057E88BB96F8';
Resultado (usando salida vertical):
name | PK__Genres__0385057E88BB96F8 object_id | 933578364 principal_id | NULL schema_id | 1 parent_object_id | 917578307 type | PK type_desc | PRIMARY_KEY_CONSTRAINT create_date | 2019-05-02 12:56:06.110 modify_date | 2019-05-02 12:56:06.110 is_ms_shipped | 0 is_published | 0 is_schema_published | 0
Ejemplo 8:la vista del sistema REFERENTIAL_CONSTRAINTS
Este es un poco exagerado, pero podría ser útil dependiendo de su situación. Y técnicamente, devuelve (algunas) claves primarias.
El INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
la vista del sistema devuelve una fila para cada FOREIGN KEY
restricción en la base de datos actual. Entonces, su propósito es en realidad devolver claves externas, no claves primarias. Sin embargo, esta vista puede ser útil si solo desea ver todas las claves principales que tienen una clave externa asociada. No es un método confiable para usar si desea ver todas las claves principales, independientemente de si hay una clave externa asociada.
He aquí un ejemplo:
SELECT CONSTRAINT_NAME, UNIQUE_CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS;
Resultado:
+-------------------+-------------------------------+ | CONSTRAINT_NAME | UNIQUE_CONSTRAINT_NAME | |-------------------+-------------------------------| | FK_Albums_Artists | PK__Artists__25706B50FCD918B1 | | FK_Albums_Genres | PK__Genres__0385057E88BB96F8 | +-------------------+-------------------------------+
Como puede ver, esto solo devuelve aquellas claves primarias que tienen una clave externa asociada. Para ser más precisos, en realidad es al revés:devuelve todas las claves externas, junto con su UNIQUE
asociado. restricción.
Entonces, si comparamos estos resultados con los resultados de los ejemplos anteriores, podemos ver que solo se devuelven dos claves principales (en comparación con las tres de los ejemplos anteriores). Esto se debe a que una de las claves principales de esta base de datos ( PK__Albums__97B4BE379FC780BD ) no tiene una clave externa asociada.
Aquí hay un ejemplo que devuelve todos los datos para claves foráneas de las cuales
PK__Artists__25706B50FCD918B1
es el UNIQUE
restricción:
SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE UNIQUE_CONSTRAINT_NAME = 'PK__Artists__25706B50FCD918B1';
Resultado:
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | FK_Albums_Artists UNIQUE_CONSTRAINT_CATALOG | Music UNIQUE_CONSTRAINT_SCHEMA | dbo UNIQUE_CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 MATCH_OPTION | SIMPLE UPDATE_RULE | NO ACTION DELETE_RULE | NO ACTION
En este caso, solo se devuelve una clave externa.
Como se mencionó, esta vista es principalmente para devolver información de clave externa, así que solo use este método si desea ver información de clave externa junto con la clave principal asociada. No utilice este método si desea ver todas las claves principales independientemente de si tienen una clave externa asociada.
Ejemplo 9:el procedimiento almacenado del sistema sp_fkeys
Este método es similar al método anterior, en el sentido de que devuelve información de clave externa. También devuelve la clave principal asociada con cada clave externa.
Ejemplo:
EXEC sp_fkeys Artists;
Resultado (usando salida vertical):
PKTABLE_QUALIFIER | Music PKTABLE_OWNER | dbo PKTABLE_NAME | Artists PKCOLUMN_NAME | ArtistId FKTABLE_QUALIFIER | Music FKTABLE_OWNER | dbo FKTABLE_NAME | Albums FKCOLUMN_NAME | ArtistId KEY_SEQ | 1 UPDATE_RULE | 1 DELETE_RULE | 1 FK_NAME | FK_Albums_Artists PK_NAME | PK__Artists__25706B50FCD918B1 DEFERRABILITY | 7
Podría haber usado la siguiente sintaxis en su lugar (o una combinación de estos argumentos):
EXEC sp_fkeys @pktable_name = Artists, @pktable_owner = dbo, @pktable_qualifier = Music, @fktable_name = Albums, @fktable_owner = dbo, @fktable_qualifier = Music;
Al igual que con el ejemplo anterior, no se debe confiar en este método para devolver todas las claves principales. Si una clave principal no tiene una clave externa asociada, no se devolverá.
Ejemplo 10:el procedimiento almacenado del sistema sp_helpconstraint
La sp_helpconstraint
El procedimiento almacenado del sistema devuelve una lista de todos los tipos de restricciones, su nombre definido por el usuario o proporcionado por el sistema, las columnas en las que se han definido y la expresión que define la restricción (para DEFAULT
y CHECK
restricciones solamente).
Por lo tanto, puede usarlo para devolver información sobre claves primarias en su base de datos.
Ejemplo:
EXEC sp_helpconstraint Albums;
Resultado:
+---------------+ | Object Name | |---------------| | Albums | +---------------+ -[ RECORD 1 ]------------------------- constraint_type | FOREIGN KEY constraint_name | FK_Albums_Artists delete_action | No Action update_action | No Action status_enabled | Enabled status_for_replication | Is_For_Replication constraint_keys | ArtistId -[ RECORD 2 ]------------------------- constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replication | constraint_keys | REFERENCES Music.dbo.Artists (ArtistId) -[ RECORD 3 ]------------------------- constraint_type | FOREIGN KEY constraint_name | FK_Albums_Genres delete_action | No Action update_action | No Action status_enabled | Enabled status_for_replication | Is_For_Replication constraint_keys | GenreId -[ RECORD 4 ]------------------------- constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replication | constraint_keys | REFERENCES Music.dbo.Genres (GenreId) -[ RECORD 5 ]------------------------- constraint_type | PRIMARY KEY (clustered) constraint_name | PK__Albums__97B4BE379FC780BD delete_action | (n/a) update_action | (n/a) status_enabled | (n/a) status_for_replication | (n/a) constraint_keys | AlbumId
Ejemplo 11:el procedimiento almacenado del sistema sp_help
El sp_help
El procedimiento almacenado del sistema informa sobre un objeto de la base de datos (cualquier objeto enumerado en sys.sysobjects
vista de compatibilidad), un tipo de datos definido por el usuario o un tipo de datos. Esto incluye información sobre claves principales.
Cuando ejecuta esto sin ningún argumento, proporciona información sobre la información de resumen de los objetos de todos los tipos que existen en la base de datos actual (es decir, mucho de información).
Sin embargo, puede proporcionar el nombre de una tabla y devolverá información sobre esa tabla. Una vez más, obtendrá una gran cantidad de información devuelta, pero entre esta habrá información clave principal.
Ejemplo:
EXEC sp_help Artists;
Resultado:
+---------+---------+------------+-------------------------+ | Name | Owner | Type | Created_datetime | |---------+---------+------------+-------------------------| | Artists | dbo | user table | 2019-05-02 12:56:05.840 | +---------+---------+------------+-------------------------+ -[ RECORD 1 ]------------------------- Column_name | ArtistId Type | int Computed | no Length | 4 Prec | 10 Scale | 0 Nullable | no TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | NULL -[ RECORD 2 ]------------------------- Column_name | ArtistName Type | nvarchar Computed | no Length | 510 Prec | Scale | Nullable | no TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | SQL_Latin1_General_CP1_CI_AS -[ RECORD 3 ]------------------------- Column_name | ActiveFrom Type | date Computed | no Length | 3 Prec | 10 Scale | 0 Nullable | yes TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | NULL +------------+--------+-------------+-----------------------+ | Identity | Seed | Increment | Not For Replication | |------------+--------+-------------+-----------------------| | ArtistId | 1 | 1 | 0 | +------------+--------+-------------+-----------------------+ +-------------------------------+ | RowGuidCol | |-------------------------------| | No rowguidcol column defined. | +-------------------------------+ +-----------------------------+ | Data_located_on_filegroup | |-----------------------------| | PRIMARY | +-----------------------------+ +-------------------------------+---------------------------------------------------+--------------+ | index_name | index_description | index_keys | |-------------------------------+---------------------------------------------------+--------------| | PK__Artists__25706B50FCD918B1 | clustered, unique, primary key located on PRIMARY | ArtistId | +-------------------------------+---------------------------------------------------+--------------+ -[ RECORD 1 ]------------------------- constraint_type | PRIMARY KEY (clustered) constraint_name | PK__Artists__25706B50FCD918B1 delete_action | (n/a) update_action | (n/a) status_enabled | (n/a) status_for_replication | (n/a) constraint_keys | ArtistId +--------------------------------------+ | Table is referenced by foreign key | |--------------------------------------| | Music.dbo.Albums: FK_Albums_Artists | +--------------------------------------+
También puede proporcionar el nombre de una clave principal para obtener información básica sobre ella:
EXEC sp_help PK__Artists__25706B50FCD918B1;
Resultado:
+-------------------------------+---------+-----------------+-------------------------+ | Name | Owner | Type | Created_datetime | |-------------------------------+---------+-----------------+-------------------------| | PK__Artists__25706B50FCD918B1 | dbo | primary key cns | 2019-05-02 12:56:05.853 | +-------------------------------+---------+-----------------+-------------------------+