sql >> Databasteknik >  >> RDS >> Sqlserver

11 sätt att hämta en primärnyckel i SQL Server (T-SQL-exempel)

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:

namn | PK__Album__97B4BE379FC780BDobject_id | 965578478principal_id | NULLschema_id | 1parent_object_id | 949578421typ | PKtype_desc | PRIMARY_KEY_CONSTRAINT skapa_datum | 2019-05-02 12:56:06.377modify_date | 2019-05-02 12:56:06.377is_ms_shipped | 0is_publicerad | 0is_schema_published | 0unique_index_id | 1is_system_named | 1is_enforced | 1

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):

namn | PK__Genres__0385057E88BB96F8object_id | 933578364principal_id | NULLschema_id | 1parent_object_id | 917578307typ | PKtype_desc | PRIMARY_KEY_CONSTRAINT skapa_datum | 2019-05-02 12:56:06.110modify_date | 2019-05-02 12:56:06.110is_ms_shipped | 0is_publicerad | 0is_schema_published | 0

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 |+-------------------------------------+------ ---+----------------+--------------------------------+ 
  1. skriv ut start- och slutdatum på en rad för kontinuerliga eller överlappande datumintervall i Oracle SQL

  2. Skillnaden mellan LIKE och ~ i Postgres

  3. sql-satsfel:kolumn .. finns inte

  4. Hur RandomBlob() fungerar i SQLite