Trong MySQL, làm thế nào để tôi có được một danh sách tất cả các ràng buộc khóa ngoài chỉ vào một bảng cụ thể? một cột cụ thể? Đây là điều tương tự như câu hỏi này của Oracle , nhưng đối với MySQL.
Trong MySQL, làm thế nào để tôi có được một danh sách tất cả các ràng buộc khóa ngoài chỉ vào một bảng cụ thể? một cột cụ thể? Đây là điều tương tự như câu hỏi này của Oracle , nhưng đối với MySQL.
Câu trả lời:
Đối với một bảng:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Đối với một cột:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
Về cơ bản, chúng tôi đã thay đổi REAXENCED_TABLE_NAME bằng REFERENCED_COLUMN_NAME trong mệnh đề where.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDIT: Như đã chỉ ra trong các bình luận, đây không phải là câu trả lời chính xác cho câu hỏi OP, nhưng thật hữu ích khi biết lệnh này. Câu hỏi này xuất hiện trên Google cho những gì tôi đang tìm kiếm và hình dung tôi sẽ để lại câu trả lời này cho những người khác tìm thấy.
SHOW CREATE TABLE `<yourtable>`;
Tôi tìm thấy câu trả lời này ở đây: MySQL: hiển thị các ràng buộc trên lệnh bảng
Tôi cần theo cách này vì tôi muốn xem FK hoạt động như thế nào, thay vì chỉ xem nó có tồn tại hay không.
<yourtable>
, không phải tất cả các ràng buộc trỏ đến <yourtable>
.
display foreign keys mysql
google, có thể đó là lý do tại sao;)
Nếu bạn sử dụng InnoDB và FK được xác định, bạn có thể truy vấn cơ sở dữ liệu information_schema, vd:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
Đăng một câu trả lời cũ để thêm một số thông tin hữu ích.
Tôi đã gặp một vấn đề tương tự, nhưng tôi cũng muốn thấy CONSTRAINT_TYPE cùng với tên bảng và cột TÀI LIỆU THAM KHẢO. Vì thế,
Để xem tất cả các FK trong bảng của bạn:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
Để xem tất cả các bảng và FK trong lược đồ của bạn:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
Để xem tất cả các FK trong cơ sở dữ liệu của bạn:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
Nhớ lại!
Đây là sử dụng công cụ lưu trữ InnoDB. Nếu bạn dường như không thể nhận được bất kỳ khóa ngoại nào để hiển thị sau khi thêm chúng, có thể là do các bảng của bạn đang sử dụng MyISAM.
Để kiểm tra:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Để khắc phục, sử dụng điều này:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Thay thế cho câu trả lời của Node, nếu bạn sử dụng InnoDB và FK được xác định, bạn có thể truy vấn cơ sở dữ liệu information_schema, ví dụ:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
cho các khóa ngoại từ <bảng> hoặc
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
cho các khóa ngoại vào <bảng>
Bạn cũng có thể nhận được UPDATE_RULE và DELETE_RULE nếu bạn muốn chúng.
Giải pháp này sẽ không chỉ hiển thị tất cả các mối quan hệ mà còn cả tên ràng buộc, được yêu cầu trong một số trường hợp (ví dụ: chống hạn chế):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
Nếu bạn muốn kiểm tra các bảng trong cơ sở dữ liệu cụ thể, ở cuối truy vấn, hãy thêm tên lược đồ:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
Tương tự, đối với một tên cột cụ thể, thêm
và tên_bảng = 'tên_bảng
ở cuối truy vấn
Lấy cảm hứng từ bài viết này ở đây
Cách nhanh chóng để liệt kê FK của bạn (tham chiếu Khóa ngoài) bằng cách sử dụng
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Truy vấn này giả định rằng các ràng buộc và tất cả các bảng tham chiếu và tham chiếu nằm trong cùng một lược đồ.
Thêm bình luận của riêng bạn.
Nguồn: hướng dẫn sử dụng mysql chính thức.
Giải pháp tôi đưa ra rất mong manh; nó dựa vào quy ước đặt tên của django cho các khóa ngoại.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Sau đó, trong vỏ,
grep 'refs_tablename_id' mysql_output
Để tìm tất cả các bảng có chứa một khóa ngoại cụ thể, chẳng hạn nhưemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Nếu bạn cũng muốn lấy tên của cột khóa ngoại:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;