2010-10-23 33 views
162

Tôi có các bảng mà tôi đã thử thiết lập các mối quan hệ PK FK nhưng tôi muốn xác minh điều này. Làm thế nào tôi có thể hiển thị các hạn chế PK/FK? Tôi thấy this trang thủ công, nhưng nó không hiển thị các ví dụ và tìm kiếm google của tôi cũng không có kết quả. Cơ sở dữ liệu của tôi là chứng chỉ 1 và các bảng bị ràng buộc của tôi là các thực hành và cred_insurances.Hiển thị các ràng buộc trên bảng lệnh

Trả lời

321

tôi sử dụng

SHOW CREATE TABLE mytable; 

này cho bạn thấy các câu lệnh SQL cần thiết để receate mytable trong hình thức hiện tại của nó. Bạn có thể xem tất cả các cột và loại của chúng (như DESC) nhưng nó cũng cho bạn thấy thông tin ràng buộc (và kiểu bảng, bảng mã, v.v.).

+6

Tôi không nghĩ rằng nó cho thấy các mối quan hệ fk đến? như trong ví dụ, 'a.col_one references b.col_one' và trong' show create table b' sẽ không chứa chi tiết về mối quan hệ đã nói ở trên. –

+1

Tôi xác nhận rằng lệnh này không hiển thị ràng buộc khóa ngoài. –

+0

Hãy coi chừng MariaDB bắt đầu bằng 10.2 sẽ trả về kết quả khó xử ở đây. https://jira.mariadb.org/browse/MDEV-15377 – stamster

6

Hãy thử thực hiện:

SHOW TABLE STATUS FROM credentialing1; 

Các ràng buộc khoá ngoại được liệt kê trong Comment cột của đầu ra.

+3

Tôi chỉ thấy các nhận xét bảng trong cột Nhận xét. Nó có lẽ là một cái gì đó để làm với các loại InnoDB. – clockworkgeek

+0

Nhận xét chỉ dành cho nhận xét của người dùng. Đó chắc chắn không phải là nơi lưu trữ các định nghĩa FK! Nếu chúng dành cho bạn - nó phải được thực hiện thay cho bạn bởi một số công cụ RDBMS. – stamster

80

Đơn giản chỉ cần truy vấn INFORMATION_SCHEMA:

USE INFORMATION_SCHEMA; 
SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "<your_database_name>" 
     AND TABLE_NAME = "<your_table_name>" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 
+7

Đây là câu trả lời hay nhất vì nó cung cấp cho bạn kết quả theo định dạng mà bạn có thể sử dụng theo chương trình. Tất nhiên bạn sẽ cần phải thêm một mệnh đề WHERE để thu hẹp kết quả –

+0

Điều này đã giúp tôi tìm thấy một bảng bị hỏng có cột 'id' tham chiếu một số khóa ngoại. Không có thắc mắc bảng có 1452 IntegrityError. –

+0

Đây là câu trả lời tuyệt vời! Cảm ơn @ Resh32 – simhumileco

5

Bạn có thể sử dụng này:

select 
    table_name,column_name,referenced_table_name,referenced_column_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 

Hoặc sử dụng đầu ra định dạng tốt hơn này:

select 
    concat(table_name, '.', column_name) as 'foreign key', 
    concat(referenced_table_name, '.', referenced_column_name) as 'references' 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 
+0

ORA-00.942: bảng hoặc xem không tồn tại 00942. 00000 - "bảng hoặc xem không tồn tại" * Nguyên nhân: * Hành động: Lỗi tại Line: 29 Cột: 5 Dòng 29 là "information_schema.key_column_usage" – noboundaries

+2

@noboundaries bạn đang cố gắng trên Oracle, câu hỏi là về MySQL – ymajoros

15

Vấn đề chính với câu trả lời xác nhận bạn sẽ phải phân tích đầu ra để nhận thông tin. Đây là truy vấn cho phép bạn nhận chúng theo cách dễ sử dụng hơn:

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION, 
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE, 
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH, 
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE, 
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA, 
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME, 
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE, 
    links.TABLE_NAME, links.COLUMN_NAME, 
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE 
FROM INFORMATION_SCHEMA.`COLUMNS` as cols 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs 
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.TABLE_NAME=cols.TABLE_NAME 
    AND refs.COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs 
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links 
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME 
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks 
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME 
WHERE cols.TABLE_SCHEMA=DATABASE() 
    AND cols.TABLE_NAME="table" 
6

afaik để yêu cầu information_schema bạn cần đặc quyền. Nếu quý vị cần danh sách đơn giản của các phím, bạn có thể sử dụng lệnh này:

SHOW INDEXES IN <tablename> 
+0

cảm ơn đã làm việc cho tôi –

+0

Làm thế nào là gọi information_schema là tốt hơn này, cảm ơn rất nhiều –

+0

Cảm ơn, đây là tốt nhất –

0

Ngoài ra còn có một công cụ mà oracle khiến gọi mysqlshow

Nếu bạn chạy nó với --k keys $table_name tùy chọn nó sẽ hiển thị các phím.

SYNOPSIS 
    mysqlshow [options] [db_name [tbl_name [col_name]]] 
....... 
....... 
....... 
· --keys, -k 
    Show table indexes. 

dụ:

╰─➤ mysqlshow -h 127.0.0.1 -u root -p --keys database tokens 
Database: database Table: tokens 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| Field   | Type    | Collation   | Null | Key | Default | Extra   | Privileges      | Comment | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| id    | int(10) unsigned |     | NO | PRI |   | auto_increment | select,insert,update,references |   | 
| token   | text    | utf8mb4_unicode_ci | NO |  |   |    | select,insert,update,references |   | 
| user_id   | int(10) unsigned |     | NO | MUL |   |    | select,insert,update,references |   | 
| expires_in  | datetime   |     | YES |  |   |    | select,insert,update,references |   | 
| created_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
| updated_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| tokens | 0   | PRIMARY     | 1   | id   | A   | 2   |   |  |  | BTREE  |   |    | 
| tokens | 1   | tokens_user_id_foreign | 1   | user_id  | A   | 2   |   |  |  | BTREE  |   |    | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
0

Tương tự như @Resh32, nhưng không có nhu cầu sử dụng các USE tuyên bố:

SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "database_name" 
     AND TABLE_NAME = "table_name" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 

hữu ích, ví dụ sử dụng ORM.

+0

Điều đó sẽ không hiển thị các quy tắc ràng buộc thực tế - ví dụ 'ON UPDATE CASCADE' – stamster

Các vấn đề liên quan