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


91

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


1
MySQLには複数のタイプの制約があります。どういう意味?あなたが探しているものの例を挙げていただけますか?
Mark Byers、2010年

回答:


141

information_schema.table_constraintsテーブルを使用して、各テーブルに定義されている制約の名前を取得します。

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'

1
このリストには、UNIQUE、PRIMARY KEY、またはFOREIGN KEY制約のみが含まれます。CHECKは可能ですが、強制されていません。このクエリを使用すると、DEFAULT制約は表示されません。
OMGポニー2010年

MySQLはCHECK制約を格納しません。定義しようとすると、構文解析されて自動的に破棄されます。
Bill Karwinが2010年

1
DEFAULT値は制約としてカウントされません。に保存されていinformation_schema.columns.column_defaultます。
Bill Karwin、2010年

22

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

制約名のリストのみを検索している(他の詳細/列は検索していない)ための変更されたクエリを提示します。

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

2
あなたは、あなたがそれを見つけたら、1を削除する必要がある場合は、こちらをご覧stackoverflow.com/a/838412/2401804
r3wt

9

これは、主キーと外部キーの制約だけでなく、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

-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
これは、私の知る限り、MySQLではなくOracleにあります。
Pradyumn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.