テーブルの制約を表示するコマンド


224

PK FK関係を設定しようとしたテーブルがありますが、これを確認したいと思います。PK / FK拘束を表示するにはどうすればよいですか?私はこのマニュアルページを見ましたが、それは例を示していません、そして私のグーグル検索もまた無益でした。私のデータベースはでcredentialing1あり、私の制約付きテーブルはpracticesおよびcred_insurancesです。

回答:


414

私が使う

SHOW CREATE TABLE mytable;

これはmytable、現在の形式で受け取るために必要なSQLステートメントを示しています。すべての列とそのタイプ(などDESC)を表示できますが、制約情報(およびテーブルタイプ、文字セットなど)も表示されます。


8
入ってくるfk関係を示していると思いませんか?例えば、のようにa.col_one references b.col_oneして中にshow create table b前述の関係についての詳細は含まれません。
Vineet Menon 2014

1
このコマンドで外部キー制約が表示されないことを確認しました。
Kemin Zhou

2
10.2以降のMariaDBはここで厄介な結果を返すことに注意してください。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 '27

これは、いくつかの外部キーを参照する列「id」を含む破損したテーブルを見つけるのに役立ちました。テーブルが1452 IntegrityErrorになったのも当然です。
Vicky T

これは素晴らしい答えです!ありがとう@ Resh32
simhumileco

回答の前に「Simply」を付けたのが気に入っています。しかし、すばらしい答えです!
leviathanbadger 2017年

実際の制約ルールは表示されません-例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

information_schema権限を必要とするあなたに要求をするためにafaik 。キーの簡単なリストが必要な場合は、次のコマンドを使用できます。

SHOW INDEXES IN <tablename>

information_schemaの呼び出しはこれよりも優れています。ありがとう
ございました。EiadSamman 2017

6

やってみてください:

SHOW TABLE STATUS FROM credentialing1;

外部キー制約は、出力のコメント列にリストされます。


3
[コメント]列にはテーブルコメントのみが表示されます。それはおそらくInnoDB型と関係があります。
clockworkgeek

1
コメントはユーザーのコメントのみです。FK定義が格納されている場所ではありません!それらがあなたのためであるなら-それはいくつかのRDBMSツールによってあなたに代わって行われたに違いありません。
スタムスター2018

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"
noboundaries

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

オラクルが作成した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.