sql >> Databasteknik >  >> RDS >> Sqlserver

Lista alla främmande nycklar på en tabell i SQL Server

Nedan finns två metoder som du kan använda för att returnera en lista med främmande nycklar för en given tabell i SQL Server.

Det här liknar att returnera de främmande nycklarna baserat på den refererade/primära nyckeltabellen, förutom här returnerar jag de främmande nycklarna baserat på själva referens-/främmande nyckeltabellen.

Alternativ 1 – sys.foreign_keys

Följande kod hämtar alla begränsningar för främmande nyckel i den givna tabellen, tillsammans med de refererade tabellerna.

ANVÄND WideWorldImportersDW;VÄLJ OBJECT_NAME(parent_object_id) AS [FK-tabell], namn AS [Främmande nyckel], OBJECT_NAME(referenced_object_id) SOM [PK-tabell]FRÅN sys.foreign_keysWHERE parent_object_id =OBJECT.Order('F); före> 

Resultat:

+------------+-------------------------------- ------------------+------------+| FK Tabell | Utländsk nyckel | PK-tabell ||------------+---------------------------------------- ------------------+------------|| Beställ | FK_Fact_Order_City_Key_Dimension_City | Stad || Beställ | FK_Fact_Order_Customer_Key_Dimension_Customer | Kund || Beställ | FK_Fact_Order_Stock_Item_Key_Dimension_Stock Item | Lagervara || Beställ | FK_Fact_Order_Order_Date_Key_Dimension_Date | Datum || Beställ | FK_Fact_Order_Picked_Date_Key_Dimension_Date | Datum || Beställ | FK_Fact_Order_Salesperson_Key_Dimension_Employee | Anställd || Beställ | FK_Fact_Order_Picker_Key_Dimension_Employee | Anställd |+------------+---------------------------------------- ------------------+------------+

I det här fallet använder jag WideWorldImportersDW databas, och jag returnerar de främmande nycklarna för Fact.Order bord.

Alternativ 2 – sp_fkeys

Ett annat sätt att få främmande nycklar som refererar till en viss tabell är att använda sp_fkeys systemlagrad procedur. Denna lagrade procedur ger oss ett val att hämta främmande nycklar baserat på (bland annat) den refererade tabellen eller referenstabellen.

I det här fallet är vi intresserade av att få främmande nycklar baserat på tabellen med främmande nyckel, så vi kan göra detta:

EXEC sp_fkeys @fktable_name ='Beställning', @fktable_owner ='Fakta';

Resultat (med vertikal utdata):

-[ RECORD 1 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | StadPKCOLUMN_NAME | StadsnyckelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | StadsnyckelKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_City_Key_Dimension_CityPK_NAME | PK_Dimension_CityDEFERRABILITY | 7-[ RECORD 2 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | KundPKCOLUMN_NAME | KundnyckelFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | KundnyckelKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Customer_Key_Dimension_CustomerPK_NAME | PK_Dimension_CustomerDEFERRABILITY | 7-[ RECORD 3 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | Beställningsdatum KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Order_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ RECORD 4 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | DatumPKCOLUMN_NAME | DatumFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | Vald datumnyckelKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picked_Date_Key_Dimension_DatePK_NAME | PK_Dimension_DateDEFERRABILITY | 7-[ REKORD 5 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | Anställd PKCOLUMN_NAME | Anställd KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | Säljare KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Salesperson_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ REKORD 6 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | Anställd PKCOLUMN_NAME | Anställd KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | VäljarnyckelKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Picker_Key_Dimension_EmployeePK_NAME | PK_Dimension_EmployeeDEFERRABILITY | 7-[ RECORD 7 ]--------------------------------PKTABLE_QUALIFIER | WideWorldImportersDWPKTABLE_OWNER | DimensionPKTABLE_NAME | Lagervara PKCOLUMN_NAME | Lagerartikel KeyFKTABLE_QUALIFIER | WideWorldImportersDWFKTABLE_OWNER | FaktaFKTABLE_NAME | Beställ FKCOLUMN_NAME | Lagerartikel KeyKEY_SEQ | 1UPDATE_RULE | 1DELETE_RULE | 1FK_NAME | FK_Fact_Order_Stock_Item_Key_Dimension_Stock ItemPK_NAME | PK_Dimension_Stock_ItemDEFERRABILITY | 7

Detta kan enkelt växlas runt för att söka efter främmande nycklar baserat på primärnyckeltabellen genom att helt enkelt ersätta parametrarna med @pktable_name och @pktable_owner :

EXEC sp_fkeys @pktable_name ='Stad', @pktable_owner ='Dimension';

En sann/falsk kontroll

Om du bara vill veta om en tabell har en främmande nyckel eller inte, men du inte vill att allt ska listas ut, se Kontrollera om en tabell har en främmande nyckel i SQL Server med OBJECTPROPERTY().

Den artikeln använder TableHasForeignKey argument för OBJECTPROPERTY() funktion för att returnera 1 om tabellen har en främmande nyckel och 0 om det inte gör det.


  1. Hur man utför grupperad rankning i MySQL

  2. Allt du bör veta om SQL Server JOINS

  3. Radmönsterigenkänning i SQL

  4. Datamigreringar