Tampilkan kendala pada perintah tabel

224

Saya punya tabel yang saya coba atur hubungan PK FK tetapi saya ingin memverifikasi ini. Bagaimana saya bisa menunjukkan pengekangan PK / FK? Saya melihat halaman manual ini , tetapi tidak menunjukkan contoh dan pencarian google saya tidak membuahkan hasil. Database saya adalah credentialing1dan tabel dibatasi saya adalah practicesdan cred_insurances.

Kapten Claptrap
sumber

Jawaban:

414

saya menggunakan

SHOW CREATE TABLE mytable;

Ini menunjukkan kepada Anda pernyataan SQL yang diperlukan untuk menerima mytabledalam bentuk saat ini. Anda dapat melihat semua kolom dan tipenya (seperti DESC) tetapi juga memperlihatkan informasi batasan (dan tipe tabel, rangkaian karakter, dll.).

Adrian Smith
sumber
8
saya tidak berpikir itu menunjukkan hubungan fk yang masuk? seperti pada misalnya, a.col_one references b.col_onedan show create table btidak akan berisi detail tentang hubungan yang disebutkan di atas.
Vineet Menon
1
Saya mengkonfirmasi bahwa perintah ini tidak menampilkan batasan kunci asing.
Kemin Zhou
2
Berhati-hatilah karena MariaDB yang dimulai dengan 10.2 akan mengembalikan hasil yang aneh di sini. jira.mariadb.org/browse/MDEV-15377
stamster
117

Cukup pertanyaan 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;
Resh32
sumber
14
Ini adalah jawaban terbaik karena memberi Anda hasil dalam format yang dapat Anda gunakan secara terprogram. Tentu saja Anda perlu menambahkan klausa WHERE untuk mempersempit hasilnya
Naveed Hasan
Ini membantu saya menemukan tabel korup yang memiliki kolom 'id' merujuk beberapa kunci asing. Tidak heran jika tabelnya mendapatkan 1452 IntegrityError.
Vicky T
Ini jawaban yang bagus! Terima kasih @ Resh32
simhumileco
Saya suka bahwa Anda mengawali jawaban Anda dengan "Cukup." Jawaban yang bagus!
leviathanbadger
Itu tidak akan menampilkan aturan kendala yang sebenarnya - misalnyaON UPDATE CASCADE
stamster
19

Masalah utama dengan jawaban yang divalidasi adalah Anda harus mengurai output untuk mendapatkan informasi. Berikut adalah kueri yang memungkinkan Anda mendapatkannya dengan cara yang lebih bermanfaat:

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"
nfroidure
sumber
11

afaik untuk membuat permintaan kepada information_schemaAnda membutuhkan hak istimewa. Jika Anda membutuhkan daftar kunci sederhana, Anda dapat menggunakan perintah ini:

SHOW INDEXES IN <tablename>
pleerock
sumber
Bagaimana menelepon information_schema lebih baik dari ini, terima kasih banyak
Eiad Samman
6

Coba lakukan:

SHOW TABLE STATUS FROM credentialing1;

Batasan kunci asing tercantum di kolom Komentar dari output.

codaddict
sumber
3
Saya hanya melihat komentar tabel di kolom Komentar. Mungkin ada hubungannya dengan jenis InnoDB.
clockworkgeek
1
Komentar hanya untuk komentar pengguna. Itu pasti bukan tempat di mana definisi FK disimpan! Jika itu untuk Anda - itu pasti dilakukan atas nama Anda oleh beberapa alat RDBMS.
stamster
6

Anda bisa menggunakan ini:

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'

Atau untuk output yang diformat lebih baik, gunakan ini:

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'
Abhishek Gupta
sumber
ORA-00942: tabel atau tampilan tidak ada 00942. 00000 - "tabel atau tampilan tidak ada" * Penyebab: * Tindakan: Kesalahan pada Baris: 29 Kolom: 5 Baris 29 adalah "information_schema.key_column_usage"
noboundaries
2
@noboundaries Anda mencobanya pada Oracle, pertanyaannya adalah tentang MySQL
ymajoros
1

Analog dengan @ Resh32 , tetapi tanpa harus menggunakan USEpernyataan:

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;

Berguna, misalnya menggunakan ORM.

simhumileco
sumber
Itu tidak akan menampilkan aturan kendala yang sebenarnya - misalnyaON UPDATE CASCADE
stamster
0

Ada juga alat yang dibuat oracle bernama mysqlshow

Jika Anda menjalankannya dengan --k keys $table_nameopsi itu akan menampilkan tombol.

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

contoh:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
GardenRouteGold
sumber