Làm cách nào để biết ràng buộc NGOẠI KHÓA tham chiếu đến bảng trong SQL Server?


120

Tôi đang cố gắng bỏ một bảng nhưng nhận được thông báo sau:

Msg 3726, Mức 16, Trạng thái 1, Dòng 3
Không thể thả đối tượng 'dbo.UserProfile' vì nó được tham chiếu bởi ràng buộc NGOẠI KHÓA.
Msg 2714, Mức 16, Trạng thái 6, Dòng 2
Đã có một đối tượng có tên là 'UserProfile' trong cơ sở dữ liệu.

Tôi đã xem xét xung quanh với SQL Server Management Studio nhưng tôi không thể tìm thấy ràng buộc. Làm cách nào tôi có thể tìm ra các ràng buộc khóa ngoại?


2
Tôi thích sp_help 'dbo.TableName' Xem ở đây để biết thêm cách: stackoverflow.com/questions/483193/…
Mark Boltuc

2
Worth noticing:Trả lời của @LittleSweetSeas sẽ trả về thông tin về các khóa ngoại CHO một bảng tham chiếu nhất định , tuy nhiên, chi tiết câu trả lời của @ Gayathri-Varma cho một bảng mẹ nhất định . Cả hai đều là hữu ích trong bối cảnh khác nhau và cả hai đều giành chiến thắng cuộc đua của mình :-)
Izhar Aazmi

Câu trả lời:


224

Nó đây:

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'

Bằng cách này, bạn sẽ nhận được tên cột và bảng tham chiếu.

Đã chỉnh sửa để sử dụng sys.tables thay vì sys.objects chung chung theo gợi ý nhận xét. Cảm ơn, marc_s


Bạn nên sử dụng càng tập trung sys.tableshơnsys.objects
marc_s

@marc_s: Cảm ơn bạn, nhưng bạn có thể đăng một ví dụ không? AFAIK trong sys.tables tôi không có tài liệu tham khảo FK
LittleSweetSeas

3
Những gì tôi có nghĩa là nó: chỉ cần thay thế INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_idvớiINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
marc_s

@LittleSweetSeas tôi đã chạy truy vấn trên nhưng vẫn không nhận được object_name và tên cột cho bảng có ràng buộc khóa ngoại
Smart003

Bạn có thể củng cố lựa chọn của mình với một chút thông tin khác: 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.reable) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id) ReferencedColumn
DocOc,

74

Một cách khác là kiểm tra kết quả của

sp_help 'TableName'

(hoặc chỉ đánh dấu TableName được trích dẫn và ALT đặt trước + F1)

Thời gian trôi qua, tôi quyết định trau chuốt câu trả lời của mình. Dưới đây là ảnh chụp màn hình kết quả sp_helpcung cấp. A đã sử dụng AdventureWorksDW2012 DB cho ví dụ này. Có rất nhiều thông tin tốt ở đó và những gì chúng tôi đang tìm kiếm ở phần cuối - được đánh dấu bằng màu xanh lục:

nhập mô tả hình ảnh ở đây


3
1 Điều này cho phép rất nhiều thông tin hữu ích và các chương trình này các phím nước ngoài ở dưới cùng của đầu ra
Hux

1
Điều này cho phép tôi rất nhiều thông tin về số lượng nhỏ nhất của dòng mã
Rennish Joseph

Đây là lối đi ngắn tuyệt vời nhất! Hoàn toàn đánh bại Ctl-R để làm mới lược đồ!
Mr. Young

Làm mới bộ nhớ cache cục bộ InteliSense = Ctrl + Shift + R; Ctrl + R = show / hide kết quả cửa sổ (hoặc ít nhất đó là những giá trị mặc định của tôi cho SSMS2008 và SSMS2014)
Vladislav

44

Thử cái này

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
Ngắn gọn và thanh lịch, cộng thêm tác phẩm cho tôi! Chỉ có điều là namegiá trị trả về là tên nội bộ (methinks), chứ không phải tên cột thực trong bảng mẹ. Bất kỳ cách nào để khắc phục điều này?
Hamman Samuel

Những gì tôi thấy ở đây rằng cái ParentTableNamesẽ luôn giống như cái đã cho ' Tablename' trong mệnh đề where (nếu có). Điều này có thể là cố ý và sẽ hữu ích hơn khi được truy vấn cho nhiều hơn một bảng.
Izhar Aazmi

28

Tôi thấy câu trả lời này khá đơn giản và đã thực hiện thủ thuật cho những gì tôi cần: https://stackoverflow.com/a/12956348/652519

Tóm tắt từ liên kết, sử dụng truy vấn này:

EXEC sp_fkeys 'TableName'

Nhanh chóng và đơn giản. Tôi đã có thể xác định vị trí tất cả các bảng khóa ngoại, các cột tương ứng và tên khóa ngoại của 15 bảng khá nhanh chóng.

Như @mdisibio đã lưu ý bên dưới, đây là liên kết đến tài liệu trình bày chi tiết các thông số khác nhau có thể được sử dụng: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys-transact-sql


1
Có năm thông số khác để lọc trên, hữu ích nhất trong số đó phải biết là lần thứ hai, nơi bạn có thể chỉ định một giản đồ không mặc định, ví dụ nhưEXEC sp_fkeys 'Payroll', 'accounting'
mdisibio

8

Tôi đang sử dụng tập lệnh này để tìm tất cả các chi tiết liên quan đến khóa ngoại. Tôi đang sử dụng INFORMATION.SCHEMA. Dưới đây là một tập lệnh 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
Tôi đang tìm cách để xem các cột là khóa ngoại và các bảng liên quan mà cột tham chiếu, và điều này tổng hợp nó một cách độc đáo. Cảm ơn!
Nate Kindrew

Điều này bị thiếu một số khóa ngoại trên một số bảng của tôi trong khi câu trả lời của @LittleSweetSeas đã hiển thị chúng
Seafish

7

nếu bạn muốn đi qua SSMS trên cửa sổ trình khám phá đối tượng, nhấp chuột phải vào đối tượng bạn muốn thả, thực hiện xem các phụ thuộc.


7

Đây là cách tốt nhất để tìm ra Mối quan hệ chính đối ngoại trong tất cả Cơ sở dữ liệu.

exec sp_helpconstraint 'Table Name'

và một cách nữa

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

Giải pháp exec sp_helpconstraint 'Table Name'này là giải pháp duy nhất trả về bất kỳ hàng nào cho tôi. Tuy nhiên tên tương phản là vô nghĩa. PRIMARY KEY (clustered) PK__org_soft__3213E83FE6B07364
Tor

5
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

- Những điều sau đây có thể cung cấp cho bạn nhiều hơn những gì bạn đang tìm kiếm:

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

Bạn cũng có thể trả lại tất cả thông tin về Foreign Keyscâu trả lời bằng cách điều chỉnh @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

Trong SQL Server Management Studio, bạn có thể chỉ cần nhấp chuột phải vào bảng trong trình khám phá đối tượng và chọn "View Dependencies". Điều này sẽ cung cấp cho bạn một điểm khởi đầu tốt. Nó hiển thị các bảng, dạng xem và thủ tục tham chiếu đến bảng.


0

hãy thử truy vấn sau.

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

điều này sẽ cung cấp tên_kết_thức, tên_mạch sẽ được tham chiếu và các bảng sẽ phụ thuộc vào ràng buộc sẽ ở đó.


0

Bạn có thể sử dụng truy vấn này để hiển thị các Foreign keyhằng số:

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'

Lấy từ http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table- trong cơ sở dữ liệu /


0

Cách dễ nhất để lấy Primary KeyForeign Keytìm bảng là:

/*  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

Trong Object Explorer, mở rộng bảng và mở rộng các phím:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.