2011-10-14 11 views
6

外部キーを削除する必要があるデータベースがありますが、外部キーが存在するかどうかは事前にわかりません。外部キーを検索するクエリ

トリックを行うストアドプロシージャ(http://forums.mysql.com/read.php?97,218825,247526)が見つかりましたが、このためにストアドプロシージャを作成したくありません。

私は、ストアドプロシージャでIF EXISTSを使用することができます...私は、ストアドプロシージャ内のクエリを使用しようとしましたが、私は(等...などFROM NULL SELECT存在する場合は、」使用してエラーが出ますか?


今、私は実行することができる唯一のことは、

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable'; 

であると私は

あまりにもこれを試してみました
IF EXISTS (SELECT NULL FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = parm_key_name) THEN 
(...) do something (...) 
END IF; 

が、私は単純なクエリとのフォーラムでの例について見てきたと私はこれが機能しない理由を理解することはできませんYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF' at line 1

を取得します。

注:編集あなたは情報のスキームに接続する必要が壊れたリンク

+1

クエリはどのように見えますか? –

+0

具体的には、「外部キーを削除する」とはどういう意味ですか? – gview

+0

@ gview ALTER TABLE 'テーブル'のように何か外のキーを押します。 –

答えて

5

を修正すると、あなたはこのテーブルの主キーと外部キーに関するすべての情報を見つけることができ

SELECT * FROM information_schema.TABLE_CONSTRAINTS T;

あなたにinformation_schemaにアクセスするには、ROOTユーザーである必要があります。

このテーブルを使用すると、テーブル、db、および外部キーがあるかどうかを確認できます。

IF EXISTとストアドプロシージャを使用したくない場合に役立ちます。しかし、私は確かに使用することができますIF EXISTは、ストアドプロシージャのクエリに使用することができます....

+0

"information_schemaにアクセスするにはROOTユーザーである必要があります。"この情報はどこで見つかりましたか? – rstackhouse

+0

ユーザーは、情報スキーマのうち、アクセス許可を持つ部分のみを表示できると言う方がより正確だと思います。ユーザが 'GRANT ALL'で作成された場合、そのテーブルに対するパーミッションを見ることができます。 – rstackhouse

1

なぜこれでテーブル "INFORMATION_SCHEMA"を使用しないのですか?

SELECT * 
FROM `TABLE_CONSTRAINTS` 
WHERE `CONSTRAINT_TYPE` = 'FOREIGN KEY' 
0

あなたは情報の方式に接続する必要があり、あなたがこのテーブルの主キーと外部キーに関するすべての情報を見つけることができ

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; 

HELP:このリンクlist-foreign-keys-in-mysql

を見ます