Nếu bạn từng thấy mình cần tìm tất cả các bảng có khóa chính trong SQL Server, thì bài viết này có thể giúp ích cho bạn.
Bài viết này cung cấp bảy cách để trả về tất cả các bảng trong cơ sở dữ liệu hiện tại có khóa chính.
Lưu ý rằng hầu hết các ví dụ này chỉ trả về các bảng - không trả về chính các khóa chính. Nếu bạn muốn có danh sách các khóa chính, hãy xem 11 cách trả lại khóa chính trong SQL Server.
Tùy chọn 1 - OBJECTPROPERTY () với sys.tables
Tùy chọn đầu tiên liên quan đến việc 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 TableHasPrimaryKey
lý lẽ. Nếu đối số này có giá trị là 1
, chúng tôi nhận được tất cả các bảng có khóa chính (nếu đó là 0
thì chúng tôi nhận được tất cả các bảng không có khóa chính).
SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTY (object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table];
Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- +
Trong ví dụ này, cơ sở dữ liệu hiện tại có bốn bảng với một khóa chính.
Các ví dụ còn lại sẽ truy vấn cùng một cơ sở dữ liệu, vì vậy kết quả sẽ giống nhau cho các truy vấn đó.
Tùy chọn 2 - OBJECTPROPERTY () với INFORMATION_SCHEMA.TABLES
Ví dụ này sử dụng OBJECTPROPERTY()
một lần nữa, nhưng lần này tôi đang truy vấn INFORMATION_SCHEMA.TABLES
xem.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY (OBJECT_ID (CONCAT (TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasPrimaryKey') =1 ANDTABLE_TYPE ='BASE TABLE'ORDER; Kết quả:+ ---------------- + -------------- + | TABLE_SCHEMA | TABLE_NAME || ---------------- + -------------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------------- + -------------- +Tùy chọn 3 - OBJECTPROPERTY () với sys.objects
Một lần nữa
OBJECTPROPERTY()
đến để giải cứu. Lần này tôi đang 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)),' TableHasPrimaryKey ') =1ORDER BY [Lược đồ], [Bảng]Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- +Tùy chọn 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Bạn có thể truy vấn
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
xem để nhận danh sách các bảng có khóa chính. Bạn cần lọc kết quả để chỉ những hàng cóCONSTRAINT_TYPE
trong tổng sốPRIMARY KEY
.SELECT CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Kết quả:
+ --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + --------------------- + -------------- +Dạng xem này cũng trả về tên ràng buộc, vì vậy bạn cũng có thể bao gồm cột đó nếu cần:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Kết quả:
+ --------------------- + -------------- + --------- ---------------------- + | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME || --------------------- + -------------- + ---------- --------------------- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + --------------------- + -------------- + ---------- --------------------- +Tùy chọn 5 - sys.key_constraints
Bạn có thể lọc
sys.key_constraints
xem mộtCONSTRAINT_TYPE
củaPK
để nhận danh sách các bảng có khóa chính.CHỌN SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table] FROM sys.key_constraints WHERE type ='PK';Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + ---------- + --------- +Đây lại là tên khóa chính:
SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table], nameFROM sys.key_constraints WHERE type ='PK';Kết quả:
+ ---------- + --------- + ------------------------- ------ + | Lược đồ | Bảng | tên || ---------- + --------- + -------------------------- ----- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + ---------- + --------- + -------------------------- ----- +Tùy chọn 6 - sys.objects
sys.objects
chế độ xem hệ thống là một chế độ xem phổ biến để trả về thông tin về các đối tượng trong phạm vi lược đồ, bao gồm cả các khóa chính.SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table] FROM sys.objects WHERE type ='PK';Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + ---------- + --------- +Như với hai ví dụ trước, chúng ta có thể bao gồm
name
của chế độ xem này để hiển thị tên của khóa chính:SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table], nameFROM sys.objects WHERE type ='PK';Kết quả:
+ ---------- + --------- + ------------------------- ------ + | Lược đồ | Bảng | tên || ---------- + --------- + -------------------------- ----- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + ---------- + --------- + -------------------------- ----- +Tùy chọn 7 - OBJECTPROPERTYEX ()
OBJECTPROPERTYEX()
hàm hoạt động giống nhưOBJECTPROPERTY()
chức năng, ngoại trừ việc nó hỗ trợ nhiều thuộc tính hơn. Do đó, bất kỳ ví dụ nào trước đây sử dụngOBJECTPROPERTY()
, có thể dễ dàng được viết lại để sử dụngOBJECTPROPERTYEX()
.Ví dụ:tôi có thể viết lại ví dụ đầu tiên trên trang này thành như sau:
SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTYEX (object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table];Kết quả:
+ ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- +Tôi nên đề cập rằng
OBJECTPROPERTYEX()
trả về sql_variant kiểu dữ liệu, trong khiOBJECTPROPERTY()
trả về một int .