Danh sách các ràng buộc từ Cơ sở dữ liệu MySQL


91

Làm cách nào để lấy danh sách tất cả các ràng buộc từ một cơ sở dữ liệu cụ thể?


1
Có nhiều hơn một loại ràng buộc trong MySQL. Ý bạn là gì? Bạn có thể cho một ví dụ về loại thứ bạn đang tìm kiếm không?
Mark Byers

Câu trả lời:


141

Sử dụng information_schema.table_constraintsbảng để lấy tên của các ràng buộc được xác định trên mỗi bảng:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

Sử dụng information_schema.key_column_usagebảng để lấy các trường trong từng ràng buộc đó:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

Thay vào đó, nếu bạn đang nói về các ràng buộc khóa ngoại, hãy sử dụng information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
Danh sách này sẽ chỉ bao gồm các ràng buộc UNIQUE, PRIMARY KEY hoặc FOREIGN KEY. CHECK là có thể, nhưng không được thực thi. Các ràng buộc DEFAULT sẽ không hiển thị khi sử dụng truy vấn này.
OMG Ponies

MySQL không lưu trữ các ràng buộc CHECK. Nếu bạn cố gắng xác định một cái, nó sẽ phân tích cú pháp và âm thầm loại bỏ nó.
Bill Karwin

1
Giá trị DEFAULT không được tính là một ràng buộc. Nó được lưu trữ trong information_schema.columns.column_default.
Bill Karwin

22

Câu trả lời tuyệt vời của @Senseful.

Tôi đang trình bày truy vấn đã sửa đổi cho những người chỉ tìm kiếm danh sách các tên ràng buộc (chứ không phải các chi tiết / cột khác):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
nếu bạn cần xóa một khi bạn tìm thấy nó, hãy xem tại đây stackoverflow.com/a/838412/2401804
r3wt

9

Điều này thực sự hữu ích nếu bạn muốn xem các ràng buộc khóa chính và khóa ngoại cũng như các quy tắc xung quanh các ràng buộc đó chẳng hạn như ON_UPDATE và ON_DELETE cũng như tên cột và cột ngoại cùng nhau:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

Bạn thậm chí có thể muốn thêm một số thông tin khác về các cột đó, chỉ cần thêm điều này vào SQL (và chọn các cột bạn muốn):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

-3

CHỌN * TỪ USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
Đây là trong Oracle, không phải MySQL, theo như tôi biết.
Pradyumn
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.