web-dev-qa-db-ja.com

MySQLデータベースの制約のリスト

特定のデータベースからすべての制約のリストを取得するにはどうすればよいですか?

78
lolajl

使用 - information_schema.table_constraints table:各テーブルで定義された制約の名前を取得します。

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

使用 - information_schema.key_column_usage これらの制約のそれぞれのフィールドを取得するテーブル:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

代わりに外部キー制約について話している場合は、 information_schema.referential_constraints

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'
122
Senseful

@Sensefulによる素晴らしい回答。

制約名のリストのみを探している(他の詳細/列は探していない)人のために、修正されたクエリを提示しています。

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;
20
Harshith J.V.

これは、主キー制約と外部キー制約だけでなく、ON_UPDATEやON_DELETEなどの制約に関するルールや、列名と外部列名をまとめて表示したい場合に非常に役立ちます。

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

これらの列に関する追加情報を追加することもできます。これをSQLに追加するだけです(必要な列を選択します)。

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name
4
friek108