Bài viết này cung cấp bảy cách để trả về tất cả các bảng có khóa ngoại trong cơ sở dữ liệu trong SQL Server.
Mỗi bảng chỉ được trả về một lần, bất kể nó có bao nhiêu khóa ngoại. Điều này khác với việc trả về tất cả các khóa ngoại, cùng với các bảng của chúng. Nếu bạn muốn làm điều đó, hãy xem 11 cách trả về khóa ngoại trong SQL Server.
Tất cả các ví dụ ở đây đều truy vấn cùng một cơ sở dữ liệu và do đó trả về cùng một kết quả.
Tùy chọn 1 - OBJECTPROPERTY () với sys.tables
Tùy chọn đầu tiên là sử dụng OBJECTPROPERTY()
khi truy vấn sys.tables
chế độ xem hệ thống.
Hàm này chấp nhận một TableHasForeignKey
đối số sẽ là 1
hoặc 0
(hoặc NULL
). Nếu đó là 1
, điều này có nghĩa là bảng có khóa ngoại. Giá trị 0
có nghĩa là nó không có bất kỳ khóa ngoại nào. Do đó, chúng ta có thể sử dụng điều này trong WHERE
mệnh đề chỉ trả về những bảng trong đó TableHasForeignKey
được đặt thành 1
.
SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTY (object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];
Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +
Tùy chọn 2 - OBJECTPROPERTY () với INFORMATION_SCHEMA.TABLES
Ví dụ này sử dụng OBJECTPROPERTY()
khi truy vấn INFORMATION_SCHEMA.TABLES
chế độ xem hệ thống.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY (OBJECT_ID (CONCAT (TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasForeignKey') =1 ANDTABLE_TYPE ='BASE TABLE'ORDER; Kết quả:+ ---------------- + -------------- + | TABLE_SCHEMA | TABLE_NAME || ---------------- + -------------- || dbo | Album || dbo | Nghệ sĩ | + ---------------- + -------------- +Tùy chọn 3 - OBJECTPROPERTY () với sys.objects
Đây là một tùy chọn khác sử dụng
OBJECTPROPERTY()
. Lần này tôi sử dụng nó khi truy vấnsys.objects
chế độ xem hệ thống.SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY (OBJECT_ID (CONCAT (SCHEMA_NAME (schema_id),'. ', name)),' TableHasForeignKey ') =1ORDER BY [Lược đồ], [Bảng]Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +Tùy chọn 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS với DISTINCT
Đây là một ví dụ truy vấn
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
chế độ xem hệ thống trong đó loại ràng buộc làFOREIGN KEY
. Trong trường hợp này, tôi cũng sử dụngDISTINCT
để ngăn các bảng được trả về nhiều lần khi chúng có nhiều hơn một khóa ngoại.CHỌN DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME TỪ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='NGOẠI KHÓA';Kết quả:
+ --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Album || dbo | Nghệ sĩ | + --------------------- + -------------- +Đây là những gì sẽ xảy ra nếu tôi xóa
DISTINCT
mệnh đề:CHỌN CONSTRAINT_SCHEMA, TABLE_NAME TỪ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='NGOẠI KHÓA';Kết quả:
+ --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Album || dbo | Album || dbo | Nghệ sĩ | + --------------------- + -------------- +Trong trường hợp này,
Albums
bảng có hai khóa ngoại và vì vậy tôi nhận được hai hàng cho một bảng đó.Tùy chọn 5 - sys.foreign_keys với DISTINCT
Đây là một ví dụ khác sử dụng
DISTINCT
nhưng lần này tôi đang truy vấnsys.foreign_keys
chế độ xem hệ thống.CHỌN DISTINCT OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkORDER BY [Schema], [Table];Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +Và ở đây nó không có
DISTINCT
mệnh đề:SELECT OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkORDER BY [Schema], [Table];Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +Tùy chọn 6 - sys.foreign_keys với GROUP BY
Ví dụ này tương tự như ví dụ trước ở chỗ nó truy vấn
sys.foreign_keys
chế độ xem hệ thống. Sự khác biệt là ở chỗ, thay vì sử dụngDISTINCT
, nó sử dụngGROUP BY
thay vào đó mệnh đề.CHỌN OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME (fk.parent_object_id), OBJECT_NAME (fk.idp);Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +Tùy chọn 7 - OBJECTPROPERTYEX ()
Ví dụ này có thể tăng gấp đôi so với một số ví dụ trước đó, nhưng nó vẫn đáng được đề cập.
Bất kỳ ví dụ nào trước đây sử dụng
OBJECTPROPERTY()
, có thể dễ dàng được viết lại để sử dụngOBJECTPROPERTYEX()
hàm số. Hàm này về cơ bản là một phần mở rộng choOBJECTPROPERTY()
và nó thực hiện mọi thứOBJECTPROPERTY()
và hơn thế nữa.Vì vậy, tôi có thể viết lại ví dụ đầu tiên trên trang này như sau:
SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTYEX (object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- +Một điểm khác biệt mà bạn nên biết là hai hàm này trả về các kiểu trả về khác nhau.
OBJECTPROPERTY()
trả về một int trong khiOBJECTPROPERTYEX()
trả về sql_variant loại.