Як я можу дізнатися, яке обмеження FOREIGN KEY посилається на таблицю на SQL Server?


120

Я намагаюся скинути таблицю, але отримую таке повідомлення:

Msg 3726, рівень 16, стан 1, рядок 3
Не вдалося викинути об'єкт 'dbo.UserProfile', тому що на нього посилається обмеження FOREIGN KEY.
Повідомлення 2714, рівень 16, стан 6, рядок 2
У базі даних вже є об’єкт з назвою "UserProfile".

Я роздивився студію SQL Server Management Studio, але не можу знайти обмеження. Як я можу дізнатися обмеження закордонних ключів?


2
Я як sp_help «dbo.TableName» Дивіться тут для більш способів: stackoverflow.com/questions/483193 / ...
Марк Boltuc

2
Worth noticing:Відповідь від @LittleSweetSeas поверне інформацію про зовнішні ключі для заданої таблиці , однак дані про відповіді @ Gayathri-Varma для даної батьківської таблиці . Обидва корисні в різному контексті, і обидва виграють свою власну гонку :-)
Іжар Аазмі

Відповіді:


224

Ось:

SELECT 
   OBJECT_NAME(f.parent_object_id) TableName,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
WHERE 
   OBJECT_NAME (f.referenced_object_id) = 'YourTableName'

Таким чином, ви отримаєте референтну таблицю та назву стовпця.

Відредаговано для використання sys.tables замість загальних sys.objects відповідно до пропозиції коментарів. Спасибі, marc_s


Вам слід скористатися більш зосередженим, sys.tablesа неsys.objects
marc_s

@marc_s: Дякую, але чи можете ви розмістити приклад? AFAIK в sys.tables У мене немає посилань на FK
LittleSweetSeas

3
Що я це мав на увазі: просто замініть INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_idнаINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
marc_s

@LittleSweetSeas Я все ще запускав вищезазначений запит, я не отримую імені_об'єкта та імені стовпця для таблиці, яка мала обмеження для іноземного ключа
Smart003

Ви можете збільшити свій вибір за допомогою трохи більше інформації: SELECT f.name ConstraintName, f.type_desc ConstraintType, OBJECT_NAME (f.parent_object_id) ConstrainedTable, COL_NAME (fc.parent_object_id, fc.parent_column_id) ConstrainedColumn, OBJECT_NAME (f.reiddd) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id) ReferencedColumn
DocOc

74

Ще один спосіб - перевірити результати

sp_help 'TableName'

(або просто виділіть наведене табличне ім'я та прес ALT + F1)

Із часом я просто вирішив уточнити свою відповідь. Нижче наведено скріншот результатів, який sp_helpнадає. A використали БД AdventureWorksDW2012 для цього прикладу. Тут є багато корисної інформації, і те, що ми шукаємо, - в самому кінці - виділено зеленим кольором:

введіть тут опис зображення


3
+1 Це дає багато корисної інформації, і це показує зовнішні ключі в нижній частині результату
Hux

1
Це дає мені багато інформації про найменшу кількість рядків коду
Rennish Joseph

Це найкрутіша скоромовка! Повністю перемагає Ctl-R, щоб оновити схему!
Містер Янг

Оновити локальний кеш InteliSense = Ctrl + Shift + R; Ctrl + R = показати / приховати панель результатів (або принаймні це мої налаштування за замовчуванням для SSMS2008 та SSMS2014)
Владислав

44

Спробуйте це

SELECT
  object_name(parent_object_id) ParentTableName,
  object_name(referenced_object_id) RefTableName,
  name 
FROM sys.foreign_keys
WHERE parent_object_id = object_id('Tablename')

1
Короткий і елегантний, плюс працює для мене! Єдине, що nameзначення, яке повертається, - це внутрішнє ім'я (метрики), а не власне ім'я стовпця у батьківській таблиці. Будь-який спосіб це виправити?
Хамман Самуель

Що я бачу тут, що цей пункт ParentTableNameзавжди буде таким самим, як даний Tablename"у пункті де (якщо він включений). Це може бути навмисно, і стане більш корисним при запиті на більш ніж одну таблицю.
Іжар Аазмі

28

Я знайшов цю відповідь досить простою і зробив трюк для того, що мені потрібно: https://stackoverflow.com/a/12956348/652519

Підсумок посилання, використовуйте цей запит:

EXEC sp_fkeys 'TableName'

Швидкий і простий. Мені вдалося досить швидко знайти всі таблиці зовнішніх ключів, відповідні стовпці та назви іноземних ключів 15 таблиць.

Як @mdisibio зазначав нижче, ось посилання на документацію, в якій детально описані різні параметри, які можна використовувати: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys-transact-sql


1
Існує п’ять інших параметрів, на які слід фільтрувати, найкориснішим з яких слід знати, є другий, де можна вказати схему, що не використовується за замовчуванням, наприкладEXEC sp_fkeys 'Payroll', 'accounting'
mdisibio

8

Я використовую цей скрипт, щоб знайти всі деталі, пов'язані із зовнішнім ключем. Я використовую INFORMATION.SCHEMA. Нижче наведено сценарій SQL:

SELECT 
    ccu.table_name AS SourceTable
    ,ccu.constraint_name AS SourceConstraint
    ,ccu.column_name AS SourceColumn
    ,kcu.table_name AS TargetTable
    ,kcu.column_name AS TargetColumn
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
    INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
        ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
        ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME  
ORDER BY ccu.table_name

2
Я шукав спосіб побачити стовпці, які є сторонніми ключами, і пов'язані з ними таблиці, на які посилається стовпець, і це добре підсумовує це. Дякую!
Нейт Кіндрю

На деяких моїх столах не вистачало іноземних ключів, а відповідь @LittleSweetSeas показала їм
Seafish

7

якщо ви хочете зайти через SSMS у вікні провідника об’єктів, клацніть правою кнопкою миші на об’єкт, який ви хочете скинути, зробіть перегляд залежностей.


7

Ось найкращий спосіб з’ясувати зовнішньополітичні зв’язки у всіх базах даних.

exec sp_helpconstraint 'Table Name'

і ще один спосіб

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key)

Це рішення exec sp_helpconstraint 'Table Name'- єдине, яке взагалі повертає будь-які рядки. Однак назва контракту - химерність. PRIMARY KEY (clustered) PK__org_soft__3213E83FE6B07364
Тор

4
SELECT 
    obj.name      AS FK_NAME,
    sch.name      AS [schema_name],
    tab1.name     AS [table],
    col1.name     AS [column],
    tab2.name     AS [referenced_table],
    col2.name     AS [referenced_column]
FROM 
     sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
    ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
    ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
    ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
    ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
    ON col2.column_id = referenced_column_id 
        AND col2.object_id =  tab2.object_id;

1

--Наведене нижче може дати вам більше того, що ви шукаєте:

create Procedure spShowRelationShips 
( 
    @Table varchar(250) = null,
    @RelatedTable varchar(250) = null
)
as
begin
    if @Table is null and @RelatedTable is null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        order by 2,3

    if @Table is not null and @RelatedTable is null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        where object_name(k.Parent_Object_id) =@Table
        order by 2,3

    if @Table is null and @RelatedTable is not null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        where object_name(k.referenced_object_id) =@RelatedTable
        order by 2,3



end

1

Ви також можете повернути всю інформацію про Foreign Keys, адаптувавши відповідь @LittleSweetSeas:

SELECT 
   OBJECT_NAME(f.parent_object_id) ConsTable,
   OBJECT_NAME (f.referenced_object_id) refTable,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
order by
ConsTable

1

У студії управління SQL Server ви можете просто клацнути правою кнопкою миші таблицю в провіднику об'єктів і вибрати "Переглянути залежності". Це дасть вам хороший вихідний пункт. Він показує таблиці, види та процедури, які посилаються на таблицю.


0

спробуйте наступний запит.

select object_name(sfc.constraint_object_id) AS constraint_name,
       OBJECT_Name(parent_object_id) AS table_name ,
       ac1.name as table_column_name,
       OBJECT_name(referenced_object_id) as reference_table_name,      
       ac2.name as reference_column_name
from  sys.foreign_key_columns sfc
join sys.all_columns ac1 on (ac1.object_id=sfc.parent_object_id and ac1.column_id=sfc.parent_column_id)
join sys.all_columns ac2 on (ac2.object_id=sfc.referenced_object_id and ac2.column_id=sfc.referenced_column_id) 
where sfc.parent_object_id=OBJECT_ID(<main table name>);

це дасть ім'я constraint_name, column_name, яке буде посилатися, та таблиці, які залежать від обмеження, будуть там.


0

Ви можете використовувати цей запит для відображення Foreign keyконстант:

SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME
---- optional:
ORDER BY
1,2,3,4
WHERE PK.TABLE_NAME='YourTable'

Взято з http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table- в базі даних /


0

Найпростіший спосіб отримати Primary Keyта Foreign Keyза столом:

/*  Get primary key and foreign key for a table */
USE DatabaseName;

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'PK%' AND
TABLE_NAME = 'TableName'

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%' AND
TABLE_NAME = 'TableName'

0

У Провіднику об’єктів розгорніть таблицю та розгорніть Ключі:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.