Hiển thị các ràng buộc trên lệnh bảng


224

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 cách nào tôi có thể hiển thị các hạn chế PK / FK? Tôi đã thấy trang hướng dẫn này, 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à credentialing1và các bảng bị ràng buộc của tôi là practicescred_insurances.

Câu trả lời:


414

tôi sử dụng

SHOW CREATE TABLE mytable;

Điều này cho bạn thấy câu lệnh SQL cần thiết để lặp lại mytableở dạng hiện tại của nó. Bạn có thể thấy tất cả các cột và loại của chúng (như DESC) nhưng nó cũng hiển thị cho bạn thông tin ràng buộc (và loại bảng, bảng mã, v.v.).


8
tôi không nghĩ rằng nó cho thấy mối quan hệ fk đến? như trong ví dụ, a.col_one references b.col_oneshow create table bsẽ không chứa chi tiết về mối quan hệ đã nói ở trên.
Vineet Menon

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.
Kemin Zhou

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

117

Chỉ cần truy vấn THÔNG TIN_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;

14
Đây là câu trả lời tốt nhất vì nó cung cấp cho bạn kết quả ở đị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 thêm mệnh đề WHERE để thu hẹp kết quả
Naveed Hasan

Đ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ó gì ngạc nhiên khi bảng có 1452 IntegrityError.
Vicky T

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

Tôi thích rằng bạn đã đặt trước câu trả lời của bạn bằng "Đơn giản". Câu trả lời tuyệt vời, mặc dù!
leviathanbadger

Điều đó sẽ không hiển thị quy tắc hạn chế thực tế - ví dụON UPDATE CASCADE
stamster

19

Vấn đề chính với câu trả lời được xác thực là bạn sẽ phải phân tích đầu ra để có được thông tin. Đây là một truy vấn cho phép bạn có được 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"

11

afaik để thực hiện một yêu cầu cho information_schemabạn cần đặc quyền. Nếu bạn cần danh sách các phím đơn giản, bạn có thể sử dụng lệnh này:

SHOW INDEXES IN <tablename>

Cách gọi information_schema tốt hơn thế này, cảm ơn rất nhiều
Eiad Samman

6

Hãy thử làm:

SHOW TABLE STATUS FROM credentialing1;

Các ràng buộc khóa ngoài được liệt kê trong cột Nhận xét của đầu ra.


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

1
Bình luận chỉ dành cho ý kiến ​​người dùng. Đó chắc chắn không phải là nơi lưu trữ định nghĩa FK! Nếu chúng là dành cho bạn - nó phải được thực hiện thay mặt bạn bởi một số công cụ RDBMS.
stamster

6

Bạn có thể sử dụng điều 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 để đầu ra được định dạng tốt hơn, hãy sử dụng:

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'

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

2
@noboundaries bạn đang thử điều đó trên Oracle, câu hỏi là về MySQL
ymajoros

1

Tương tự như @ Resh32 , nhưng không cần sử dụng USEcâu lệnh:

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ụ như sử dụng ORM.


Điều đó sẽ không hiển thị quy tắc hạn chế thực tế - ví dụON UPDATE CASCADE
stamster

0

Ngoài ra còn có một công cụ mà nhà tiên tri thực hiện được gọi là mysqlshow

Nếu bạn chạy nó với --k keys $table_nametù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.

thí 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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
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.