tôi muốn aa phiên bản sẽ cho phép tôi tìm tất cả các cột "Key" và "ID" có/thiếu một ràng buộc. Vì vậy, tôi muốn tất cả các cột so với danh sách tất cả PK HOẶC FK HOẶC Không, đây là truy vấn của tôi. Hy vọng nó sẽ giúp người khác!
SELECT
c.table_schema
,c.table_name
,c.column_name
,KeyConstraints.constraint_type
,KeyConstraints.constraint_schema
,KeyConstraints.constraint_name
,KeyConstraints.referenced_table_schema
,KeyConstraints.referenced_table_name
,KeyConstraints.referenced_column_name
,KeyConstraints.update_rule
,KeyConstraints.delete_rule
FROM information_schema.columns AS c
LEFT JOIN
(
SELECT
FK.table_schema AS TABLE_SCHEMA
,FK.table_name
,CU.column_name
,FK.constraint_type
,c.constraint_schema
,C.constraint_name
,PK.table_schema AS REFERENCED_TABLE_SCHEMA
,PK.table_name AS REFERENCED_TABLE_NAME
,CCU.column_name AS REFERENCED_COLUMN_NAME
,C.update_rule
,C.delete_rule
FROM information_schema.referential_constraints AS C
INNER JOIN information_schema.table_constraints AS FK
ON C.constraint_name = FK.constraint_name
INNER JOIN information_schema.table_constraints AS PK
ON C.unique_constraint_name = PK.constraint_name
INNER JOIN information_schema.key_column_usage AS CU
ON C.constraint_name = CU.constraint_name
INNER JOIN information_schema.constraint_column_usage AS CCU
ON PK.constraint_name = CCU.constraint_name
WHERE (FK.constraint_type = 'FOREIGN KEY')
UNION
SELECT
ccu.table_schema
,ccu.table_name
,ccu.column_name
,tc.constraint_type
,ccu.constraint_schema
,ccu.constraint_name
,NULL
,NULL
,NULL
,NULL
,NULL
FROM information_schema.constraint_column_usage ccu
INNER JOIN information_schema.table_constraints tc
ON ccu.table_schema = tc.table_schema
AND ccu.table_name = tc.table_name
WHERE tc.constraint_type = 'PRIMARY KEY'
) AS KeyConstraints
ON c.table_schema = KeyConstraints.table_schema
AND c.table_name = KeyConstraints.table_name
AND c.column_name = KeyConstraints.column_name
WHERE c.column_name LIKE '%ID' OR c.column_name LIKE '%Key'
ORDER BY c.table_schema
,c.table_name
,c.column_name
;
định dạng lịch sự của: http://www.dpriver.com/pp/sqlformat.htm
Cảnh báo! - Điều này không trả lại các fks tham chiếu các cột chỉ mục duy nhất. Xem http://stackoverflow.com/questions/2895219/can-we-have-a-foreign-key-which-is-not-a-primary-key-in-any-other-table. –
@ Reno Reno: Đây là chính xác trong Microsoft SQL Server, bởi vì ở đó bạn có thể tham khảo một chỉ mục duy nhất trong một khóa ngoại. Nhưng tiêu chuẩn SQL không cho phép điều này và điều này không được hỗ trợ bởi tất cả các DBMS khác. Ngoài ra, không có thông tin chỉ mục có sẵn trong information_schema, vì vậy không có cách nào để sửa lỗi này. Tôi muốn nói nếu bạn không tham khảo một khóa chính là khóa ngoài, bạn đang làm một cái gì đó sai lược đồ khôn ngoan. –
Truy vấn này hầu như hoạt động chính xác cho tôi. Tôi đã thêm 'AND KCU2.TABLE_NAME = RC.REFERENCED_TABLE_NAME' vào mệnh đề ON của KCU2 JOIN để loại bỏ các bản ghi không chính xác do nhiều bảng trong cơ sở dữ liệu của tôi với khóa chính có tên là' PRIMARY'. Tôi xảy ra để chạy MariaDB 5.5, nhưng tôi nghi ngờ DBMS khác sẽ có một vấn đề tương tự. – JSmitty