แสดงข้อ จำกัด ในคำสั่ง tables


224

ฉันมีตารางที่ฉันได้ลองตั้งค่าความสัมพันธ์ของ PK FK แต่ฉันต้องการตรวจสอบสิ่งนี้ ฉันจะแสดงการควบคุม PK / FK ได้อย่างไร ผมเห็นนี้หน้าคู่มือ แต่มันไม่แสดงตัวอย่างและ Google Search ของฉันคือไร้ผลยัง ฐานข้อมูลของฉันคือcredentialing1และตารางข้อ จำกัด ของฉันและpracticescred_insurances

คำตอบ:


414

ฉันใช้

SHOW CREATE TABLE mytable;

นี่แสดงให้คุณเห็นคำสั่ง SQL ที่จำเป็นmytableในการรับในรูปแบบปัจจุบัน คุณสามารถดูคอลัมน์และประเภททั้งหมด (เช่นDESC) แต่ยังแสดงข้อมูลข้อ จำกัด (และประเภทของตารางชุดอักขระ ฯลฯ )


8
ฉันไม่คิดว่ามันจะแสดงความสัมพันธ์ fk ที่เข้ามา? ในตัวอย่างa.col_one references b.col_oneและในshow create table bจะไม่มีรายละเอียดเกี่ยวกับความสัมพันธ์ดังกล่าว
Vineet Menon

1
ฉันยืนยันว่าคำสั่งนี้ไม่แสดงข้อ จำกัด foreign key
Kemin Zhou

2
ระวัง MariaDB ที่ขึ้นต้นด้วย 10.2 จะให้ผลลัพธ์ที่น่าอึดอัดใจที่นี่ jira.mariadb.org/browse/MDEV-15377
stamster

117

เพียงแค่สอบถาม 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;

14
นี่คือคำตอบที่ดีที่สุดเพราะจะให้ผลลัพธ์ในรูปแบบที่คุณสามารถใช้โดยทางโปรแกรม แน่นอนว่าคุณจะต้องเพิ่มส่วนคำสั่ง WHERE เพื่อ จำกัด ผลลัพธ์ให้แคบลง
Naveed Hasan

สิ่งนี้ช่วยให้ฉันค้นหาตารางที่เสียหายซึ่งมีคอลัมน์ 'id' ที่อ้างอิงถึงคีย์ต่างประเทศหลายตัว ไม่น่าแปลกใจที่ตารางได้รับ 1452 IntegrityError
Vicky T

นี่คือคำตอบที่ยอดเยี่ยม! ขอบคุณ @ Resh32
simhumileco

ฉันรักที่คุณเติมคำตอบไว้ด้วยคำว่า "Simply" คำตอบที่ดี แต่!
leviathanbadger

สิ่งนั้นจะไม่แสดงกฎข้อ จำกัด ที่เกิดขึ้นจริง - เช่นON UPDATE CASCADE
stamster

19

ปัญหาหลักของคำตอบที่ได้รับการตรวจสอบคือคุณจะต้องแยกวิเคราะห์ผลลัพธ์เพื่อรับข้อมูล นี่คือข้อความค้นหาที่ช่วยให้คุณนำไปใช้ได้ในลักษณะที่มากกว่านี้:

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 เพื่อส่งคำขอให้information_schemaคุณต้องการสิทธิ์พิเศษ หากคุณต้องการรายการคีย์อย่างง่ายคุณสามารถใช้คำสั่งนี้:

SHOW INDEXES IN <tablename>

information_schema ดีกว่านี้อย่างไรขอบคุณมาก
Eiad Samman

6

ลองทำ:

SHOW TABLE STATUS FROM credentialing1;

ข้อ จำกัด คีย์ต่างประเทศแสดงอยู่ในคอลัมน์ข้อคิดเห็นของเอาต์พุต


3
ฉันเห็นเฉพาะความคิดเห็นของตารางในคอลัมน์ความคิดเห็น อาจเป็นสิ่งที่ต้องทำกับประเภท InnoDB
clockworkgeek

1
ความคิดเห็นมีไว้สำหรับความคิดเห็นของผู้ใช้เท่านั้น แน่นอนว่าไม่ใช่สถานที่สำหรับเก็บคำจำกัดความของ FK! หากพวกเขามีไว้สำหรับคุณ - จะต้องทำในนามของคุณโดยเครื่องมือ RDBMS
เริ่ม

6

คุณสามารถใช้สิ่งนี้:

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'

หรือรูปแบบผลลัพธ์ที่ดีกว่าใช้สิ่งนี้:

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: ไม่มีตารางหรือมุมมอง 00942 00000 - "ไม่มีตารางหรือมุมมอง" * สาเหตุ: * การกระทำ: ข้อผิดพลาดที่บรรทัด: 29 คอลัมน์: 5 คอลัมน์ 29 คือ "information_schema.key_column_usage"
ขุนนาง

2
@noboundaries ที่คุณพยายามทำบน Oracle, คำถามเกี่ยวกับ MySQL
ymajoros

1

คล้ายกับ@ Resh32แต่ไม่จำเป็นต้องใช้USEคำสั่ง:

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;

มีประโยชน์เช่นใช้ ORM


สิ่งนั้นจะไม่แสดงกฎข้อ จำกัด ที่เกิดขึ้นจริง - เช่นON UPDATE CASCADE
stamster

0

นอกจากนี้ยังมีเครื่องมือที่ oracle เรียกว่าmysqlshow

หากคุณรันด้วย--k keys $table_nameตัวเลือกมันจะแสดงปุ่มต่างๆ

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

ตัวอย่าง:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.