Det finns ofta många sätt att göra samma (eller liknande) sak i SQL Server. Att hämta alla primärnycklar från en databas (eller till och med bara primärnyckeln för en given tabell) är ett exempel.
Den här artikeln presenterar elva olika metoder för att hämta primär nyckelinformation i SQL Server.
Vissa av dessa kommer att vara mer användbara än andra, beroende på din exakta situation.
Exempel 1 – Sp_pkeys systemlagrade procedur
Om du bara vill ha primärnyckeln för en given tabell, sp_pkeys
systemlagrad procedur är förmodligen det snabbaste och enklaste sättet att göra det. För att göra detta, skicka bara tabellnamnet till proceduren.
Så här:
EXEC sp_pkeys artister;
Resultat (med vertikal utdata):
TABLE_QUALIFIER | MusikTABLE_OWNER | dboTABLE_NAME | ArtisterCOLUMN_NAME | ArtistIdKEY_SEQ | 1PK_NAME | PK__Artister__25706B50FCD918B1
I det här fallet begärde jag primärnyckeln från Artister tabell. Den returnerar primärnyckelns namn ( PK__Artists__25706B50FCD918B1 ), databasnamnet ( Musik ), tabellnamnet, kolumnnamnet ( ArtistId ), plus annan information.
Alternativt kunde jag uttryckligen ha angett alla argument för att få samma resultat:
EXEC sp_pkeys @table_name =Artister, @table_owner =dbo, @table_qualifier =Musik;
Exempel 2 – KEY_COLUMN_USAGE Systemvy
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
systemvyn returnerar en rad för varje kolumn som är begränsad som en nyckel i den aktuella databasen. Därför kommer du också att få främmande nycklar tillbaka med denna vy.
VÄLJ TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
Resultat:
+---------------+---------------+--------------- ----------------+| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME ||--------------+---------------+---------------- ---------------|| Album | ArtistId | FK_Album_Artister || Album | GenreId | FK_Albums_Genres || Album | AlbumId | PK__Album__97B4BE379FC780BD || Konstnärer | ArtistId | PK__Artister__25706B50FCD918B1 || Genrer | GenreId | PK__Genres__0385057E88BB96F8 |+--------------+---------------+---------------- ---------------+
Vi kan se att detta returnerar begränsningar från alla tabeller. Vi kan också lägga till en WHERE
klausul för att begränsa resultaten till en specifik tabell.
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERE TABLE_NAME ='Artister';
Resultat:
+---------------+---------------+--------------- ----------------+| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME ||--------------+---------------+---------------- ---------------|| Konstnärer | ArtistId | PK__Artists__25706B50FCD918B1 |+--------+---------------+---------------- ---------------+
I dessa exempel har jag begränsat resultaten till bara de kolumner i vyn som jag är intresserad av, men du kan också använda asterisken (*
) jokertecken för att returnera alla kolumner.
VÄLJ *FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERE TABLE_NAME ='Artister';
Resultat (med vertikal utdata):
CONSTRAINT_CATALOG | MusikCONSTRAINT_SCHEMA | dboCONSTRAINT_NAME | PK__Artister__25706B50FCD918B1TABLE_CATALOG | MusikTABLE_SCHEMA | dboTABLE_NAME | ArtisterCOLUMN_NAME | ArtistIdORDINAL_POSITION | 1
Exempel 3 – CONSTRAINT_COLUMN_USAGE Systemvy
Detta liknar det föregående exemplet. INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
systemvyn returnerar en rad för varje kolumn i den aktuella databasen som har en begränsning definierad på kolumnen. Som med INFORMATION_SCHEMA.KEY_COLUMN_USAGE
du kommer också att få främmande nycklar tillbaka med den här vyn. Men INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
är inte begränsad till bara viktiga begränsningar.
VÄLJ TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE;
Resultat:
+---------------+---------------+--------------- ----------------+| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME ||--------------+---------------+---------------- ---------------|| Album | ArtistId | FK_Album_Artister || Album | GenreId | FK_Albums_Genres || Album | AlbumId | PK__Album__97B4BE379FC780BD || Konstnärer | ArtistId | PK__Artister__25706B50FCD918B1 || Genrer | GenreId | PK__Genres__0385057E88BB96F8 |+--------------+---------------+---------------- ---------------+
Du kan använda en WHERE
sats för att endast returnera en specifik tabell eller kolumn:
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGEWHERE COLUMN_NAME ='ArtistId';
Resultat:
+---------------+---------------+--------------- ----------------+| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME ||--------------+---------------+---------------- ---------------|| Album | ArtistId | FK_Album_Artister || Konstnärer | ArtistId | PK__Artists__25706B50FCD918B1 |+--------+---------------+---------------- ---------------+
I det här fallet angav jag ett kolumnnamn, så det returnerade alla begränsningar för kolumner med det namnet. Det visar sig att databasen använder samma kolumnnamn i två olika tabeller. Den ena har en främmande nyckel-begränsning, den andra en primärnyckel. Därför returneras båda raderna.
Återigen kan du använda asterisken (*
) jokertecken för att returnera alla kolumner.
VÄLJ *FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGEWHERE TABLE_NAME ='Artister';
Resultat (med vertikal utdata):
TABLE_CATALOG | MusikTABLE_SCHEMA | dboTABLE_NAME | ArtisterCOLUMN_NAME | ArtistIdCONSTRAINT_CATALOG | MusikCONSTRAINT_SCHEMA | dboCONSTRAINT_NAME | PK__Artister__25706B50FCD918B1
I det här exemplet begränsade jag utdata till bara begränsningar på en specifik tabell.
Exempel 4 – CONSTRAINT_TABLE_USAGE Systemvy
INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
systemvyn returnerar en rad för varje tabell i den aktuella databasen som har en begränsning definierad på tabellen.
VÄLJ TABLE_NAME, CONSTRAINT_NAME FRÅN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE;
Resultat:
+--------------+------------------------------------- +| TABLE_NAME | CONSTRAINT_NAME ||--------------+--------------------------------------| | Konstnärer | PK__Artister__25706B50FCD918B1 || Genrer | PK__Genres__0385057E88BB96F8 || Album | PK__Album__97B4BE379FC780BD || Album | FK_Album_Artister || Album | FK_Albums_Genres |+--------------+--------------------------------------+
Den här vyn returnerar inte kolumnnamnen som begränsningarna används på, så den kanske inte är lika användbar för dig, beroende på dina krav.
Här är ett exempel som visar all data som returneras av den här vyn för genrerna tabell:
VÄLJ * FRÅN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGEWHERE TABLE_NAME ='Genrer';
Resultat:
TABLE_CATALOG | MusikTABLE_SCHEMA | dboTABLE_NAME | GenrerCONSTRAINT_CATALOG | MusikCONSTRAINT_SCHEMA | dboCONSTRAINT_NAME | PK__Genres__0385057E88BB96F8
Exempel 5 – Systemvyn TABLE_CONSTRAINTS
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
systemvyn returnerar en rad för varje tabellbegränsning i den aktuella databasen.
VÄLJ TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
Resultat:
+--------------+------------------------------------- +------------------------+| TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE ||--------------+-------------------------------------+ ------------------|| Konstnärer | PK__Artister__25706B50FCD918B1 | PRIMÄRNYCKEL || Genrer | PK__Genres__0385057E88BB96F8 | PRIMÄRNYCKEL || Album | PK__Album__97B4BE379FC780BD | PRIMÄRNYCKEL || Album | FK_Album_Artister | UTLÄNDSK NYCKEL || Album | FK_Albums_Genres | UTLÄNDSK NYCKEL |+--------------+------------------------------------- +-------------------+
Den här vyn tillhandahåller inte kolumnnamnet, men den tillhandahåller begränsningstypen. Därför kan du begränsa resultaten till bara primärnycklar:
VÄLJ TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='PRIMÄRNYCKEL';
Resultat:
+--------------+------------------------------------- +------------------------+| TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE ||--------------+-------------------------------------+ ------------------|| Konstnärer | PK__Artister__25706B50FCD918B1 | PRIMÄRNYCKEL || Genrer | PK__Genres__0385057E88BB96F8 | PRIMÄRNYCKEL || Album | PK__Album__97B4BE379FC780BD | PRIMÄRNYCKEL |+--------------+---------------------------------------- +-------------------+
Här är ett exempel som använder ett jokertecken (*
) tecken för att returnera all data för begränsningar på
Artister
tabell:
VÄLJ *FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE TABLE_NAME ='Artister';
Resultat:
CONSTRAINT_CATALOG | MusikCONSTRAINT_SCHEMA | dboCONSTRAINT_NAME | PK__Artister__25706B50FCD918B1TABLE_CATALOG | MusikTABLE_SCHEMA | dboTABLE_NAME | ArtisterCONSTRAINT_TYPE | PRIMÄRKEYIS_DEFERRABLE | NOINITIALLY_DEFERRED | NEJ
Exempel 6 – Key_constraints System View
sys.key_constraints
systemvyn innehåller en rad för varje objekt som är en primärnyckel eller unik begränsning. Därför kan vi använda följande kod för att returnera alla primärnyckelbegränsningar i databasen, tillsammans med den relevanta tabellen för varje primärnyckel:
VÄLJ OBJECT_NAME(parent_object_id) SOM 'Tabell', nameFROM sys.key_constraints WHERE typ ='PK';
Resultat:
+--------+-------------------------------------+| Tabell | namn ||--------+-------------------------------------|| Konstnärer | PK__Artister__25706B50FCD918B1 || Genrer | PK__Genres__0385057E88BB96F8 || Album | PK__Album__97B4BE379FC780BD |+--------+--------------------------------------+
Naturligtvis kan du ta bort WHERE
sats för att returnera både primärnycklar och unika nycklar.
Det föregående exemplet använder OBJECT_NAME()
funktion för att returnera det överordnade tabellnamnet, snarare än dess object_id. Om jag inte använde OBJECT_NAME()
funktion, skulle resultatet ha sett ut så här:
SELECT parent_object_id, nameFROM sys.key_constraintsWHERE type ='PK';
Resultat:
+--------------------+------------------------ ------+| parent_object_id | namn ||---------------------+-------------------------------- -----|| 885578193 | PK__Artister__25706B50FCD918B1 || 917578307 | PK__Genres__0385057E88BB96F8 || 949578421 | PK__Album__97B4BE379FC780BD |+-------------------+-------------------------------- -----+
parent_object_id
returneras istället för det överordnade objektets namn. OBJECT_NAME()
funktion gör det mycket enklare för oss att förstå vilken tabell varje nyckel tillämpas på.
Här är ett exempel där jag använder jokertecknet (*
) tecken för att returnera alla kolumner för primärnyckeln i
Album
tabell:
VÄLJ *FROM sys.key_constraintsWHERE typ ='PK'OCH OBJECT_NAME(parent_object_id) ='Album';
Resultat:
Exempel 7 – Systemvyn sys.objects
sys.objects
systemvyn innehåller en rad för varje användardefinierat objekt med schemaomfattning som skapas i en databas. Så den innehåller våra tabeller och primärnycklar.
Vi kan ta den föregående frågan och ersätta key_constraints
med objects
och vi får samma resultat:
VÄLJ OBJECT_NAME(parent_object_id) SOM 'Tabell', nameFROM sys.objects WHERE type ='PK';
Resultat:
+--------+-------------------------------------+| Tabell | namn ||--------+-------------------------------------|| Konstnärer | PK__Artister__25706B50FCD918B1 || Genrer | PK__Genres__0385057E88BB96F8 || Album | PK__Album__97B4BE379FC780BD |+--------+--------------------------------------+
Här är ett exempel som returnerar all data för PK__Genres__0385057E88BB96F8 primärnyckel:
SELECT *FROM sys.objectsWHERE name ='PK__Genres__0385057E88BB96F8';
Resultat (med vertikal utdata):
Exempel 8 – Systemvyn REFERENTIAL_CONSTRAINTS
Det här är lite jobbigt, men det kan vara användbart beroende på din situation. Och tekniskt sett returnerar den (vissa) primärnycklar.
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
systemvyn returnerar en rad för varje FOREIGN KEY
begränsning i den aktuella databasen. Så dess syfte är faktiskt att returnera främmande nycklar – inte primärnycklar. Den här vyn kan dock vara praktisk om du bara vill se alla primärnycklar som har en associerad främmande nyckel. Det är inte en pålitlig metod att använda om du vill se alla primärnycklar oavsett om det finns en associerad främmande nyckel.
Här är ett exempel:
VÄLJ CONSTRAINT_NAME, UNIQUE_CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS;
Resultat:
+------------------------+-------------------------------- -----+| CONSTRAINT_NAME | UNIQUE_CONSTRAINT_NAME ||------------------------+-------------------------------- ----|| FK_Album_Artister | PK__Artister__25706B50FCD918B1 || FK_Albums_Genres | PK__Genres__0385057E88BB96F8 |+-------------------+-------------------------------- ----+
Som du kan se returnerar detta bara de primärnycklar som har en associerad främmande nyckel. För att vara mer exakt är det faktiskt tvärtom – det returnerar alla främmande nycklar, tillsammans med deras tillhörande UNIQUE
begränsning.
Så om vi jämför dessa resultat med resultaten från tidigare exempel kan vi se att endast två primärnycklar returneras (jämfört med tre från tidigare exempel). Detta beror på att en av primärnycklarna i denna databas ( PK__Albums__97B4BE379FC780BD ) har ingen associerad främmande nyckel.
Här är ett exempel som returnerar all data för främmande nycklar varav
PK__Artists__25706B50FCD918B1
är den UNIQUE
begränsning:
VÄLJ *FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSHVERE UNIQUE_CONSTRAINT_NAME ='PK__Artists__25706B50FCD918B1';
Resultat:
CONSTRAINT_CATALOG | MusikCONSTRAINT_SCHEMA | dboCONSTRAINT_NAME | FK_Albums_ArtistsUNIQUE_CONSTRAINT_CATALOG | MusikUNIQUE_CONSTRAINT_SCHEMA | dboUNIQUE_CONSTRAINT_NAME | PK__Artister__25706B50FCD918B1MATCH_OPTION | SIMPLEUPDATE_RULE | INGEN ACTIONDELETE_RULE | INGEN ÅTGÄRD
I detta fall returneras endast en främmande nyckel.
Som nämnts är denna vy främst för att returnera information om främmande nyckel, så använd endast denna metod om du vill se information om främmande nyckel tillsammans med den associerade primärnyckeln. Använd inte den här metoden om du vill se alla primärnycklar oavsett om de har en associerad främmande nyckel.
Exempel 9 – Sp_fkeys systemlagrade procedur
Denna metod liknar den tidigare metoden, i den meningen att den returnerar information om främmande nyckel. Den returnerar också den primära nyckeln som är associerad med varje främmande nyckel.
Exempel:
EXEC sp_fkeys artister;
Resultat (med vertikal utdata):
PKTABLE_QUALIFIER | MusikPKTABLE_OWNER | dboPKTABLE_NAME | ArtisterPKCOLUMN_NAME | ArtistIdFKTABLE_QUALIFIER | MusikFKTABLE_OWNER | dboFKTABLE_NAME | AlbumFKCOLUMN_NAME | ArtistIdKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Albums_ArtistsPK_NAME | PK__Artister__25706B50FCD918B1FÖRSÄLJARHET | 7
Jag kunde ha använt följande syntax istället (eller en kombination av dessa argument):
EXEC sp_fkeys @pktable_name =Artister, @pktable_owner =dbo, @pktable_qualifier =Musik, @fktable_name =Album, @fktable_owner =dbo, @fktable_qualifier =Musik;
Som med föregående exempel, bör denna metod inte förlitas på för att returnera alla primärnycklar. Om en primärnyckel inte har en associerad främmande nyckel kommer den inte att returneras.
Exempel 10 – Sp_helpconstraint System lagrad procedur
sp_helpconstraint
systemlagrad procedur returnerar en lista över alla begränsningstyper, deras användardefinierade eller systemlevererade namn, kolumnerna där de har definierats och uttrycket som definierar begränsningen (för DEFAULT
och CHECK
endast begränsningar).
Därför kan du använda den för att returnera information om primärnycklar i din databas.
Exempel:
EXEC sp_helpconstraint Albums;
Resultat:
+---------------+| Objektnamn ||--------------|| Album |+---------------+ -[ RECORD 1 ]------------------------constraint_type | UTLÄNDSK KEYconstraint_name | FK_Albums_Artistsdelete_action | Ingen Actionupdate_action | Ingen Actionstatus_enabled | Enabledstatus_for_replication | Is_For_Replicationconstraint_keys | ArtistId-[ RECORD 2 ]------------------------constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replikering | constraint_keys | REFERENSER Music.dbo.Artists (ArtistId)-[ RECORD 3 ]------------------------constraint_type | UTLÄNDSK KEYconstraint_name | FK_Albums_Genresdelete_action | Ingen Actionupdate_action | Ingen Actionstatus_enabled | Enabledstatus_for_replication | Is_For_Replicationconstraint_keys | GenreId-[ RECORD 4 ]-------------------------constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replikering | constraint_keys | REFERENSER Music.dbo.Genres (GenreId)-[ RECORD 5 ]-------------------------constraint_type | PRIMÄRNYCKEL (klustrad)constraint_name | PK__Album__97B4BE379FC780BDdelete_action | (n/a)update_action | (n/a)status_enabled | (n/a)status_for_replikering | (n/a)constraint_keys | AlbumId
Exempel 11 – Sp_help-systemets lagrade procedur
sp_help
systemlagrad procedur rapporterar information om ett databasobjekt (vilket objekt som helst som listas i sys.sysobjects
kompatibilitetsvy), en användardefinierad datatyp eller en datatyp. Detta inkluderar information om primärnycklar.
När du kör detta utan några argument, ger det information om sammanfattande information om objekt av alla typer som finns i den aktuella databasen returneras (dvs. en lot information).
Du kan dock ange namnet på en tabell, och den kommer att returnera information om den tabellen. Återigen, du kommer att få mycket information tillbaka, men bland detta kommer primär nyckelinformation.
Exempel:
EXEC sp_help Artists;
Resultat:
+---------+---------+------------+------------ ------------+| Namn | Ägare | Skriv | Created_datetime ||--------+---------+------------+-------------------- ----------|| Konstnärer | dbo | användartabell | 2019-05-02 12:56:05.840 |+---------+--------+------------+----- --------------------+ -[ SPEL 1 ]------------------------ -Kolumnnamn | ArtistIdType | intComputed | noLength | 4Prec | 10 Skala | 0 Nullbar | noTrimTrailingBlanks | (n/a)FixedLenNullInSource | (n/a)Sortering | NULL-[ RECORD 2 ]------------------------Kolumnnamn | ArtistNameType | nvarcharComputed | noLength | 510Prec | Skala | Nullbar | noTrimTrailingBlanks | (n/a)FixedLenNullInSource | (n/a)Sortering | SQL_Latin1_General_CP1_CI_AS-[ RECORD 3 ]-------------------------Kolumnnamn | ActiveFromType | dateComputed | noLength | 3Prec | 10 Skala | 0 Nullbar | yesTrimTrailingBlanks | (n/a)FixedLenNullInSource | (n/a)Sortering | NULL +------------+--------+-------------+---------------- -----------+| Identitet | Frö | Öka | Inte för replikering ||------------+--------+--------------+-------- --------------|| ArtistId | 1 | 1 | 0 |+------------+--------+-------------+----------- ------------+ +--------------------------------------+| RowGuidCol ||-------------------------------------|| Ingen rowguidcol-kolumn definierad. |+--------------------------------------+ +--------- --------------+| Data_located_on_filegroup ||----------------------------------------|| PRIMÄR |+-------------------------------------+ +---------------- ---------------+----------------------------------- ------------------+--------------+| index_name | index_description | index_keys ||--------------------------------------+-------------- ------------------------------------+------------- -|| PK__Artister__25706B50FCD918B1 | klustrad, unik, primärnyckel som finns på PRIMÄR | ArtistId |+---------------------------------------+-------------- ------------------------------------+------------- -+ -[ RECORD 1 ]-------------------------constraint_type | PRIMÄRNYCKEL (klustrad)constraint_name | PK__Artister__25706B50FCD918B1delete_action | (n/a)update_action | (n/a)status_enabled | (n/a)status_for_replikering | (n/a)constraint_keys | ArtistId +----------------------------------------------+| Tabellen refereras av främmande nyckel ||--------------------------------------------|| Music.dbo.Album:FK_Albums_Artists |+---------------------------------------------+
Du kan också ange namnet på en primärnyckel för att få lite grundläggande information om den:
EXEC sp_help PK__Artists__25706B50FCD918B1;
Resultat:
+--------------------------------------+--------+---- --------------+--------------------------------+| Namn | Ägare | Skriv | Created_datetime ||--------------------------------------+--------+----- ------------+-------------------------|| PK__Artister__25706B50FCD918B1 | dbo | primärnyckel cns | 2019-05-02 12:56:05.853 |+-------------------------------------+------ ---+----------------+--------------------------------+