2011-10-14 19 views
6

Bazı yabancı anahtarları bırakmam gereken bir veritabanım var, ancak yabancı anahtarların hala var olup olmadığını önceden bilmiyorum.Yabancı anahtarları bulmak için sorgu

Hile yapan bazı saklı yordamları (http://forums.mysql.com/read.php?97,218825,247526) buldum, ancak bunun için saklı yordam oluşturmak istemiyorum.

Sadece saklı prosedürlerde IF EXISTS kullanabilir miyim ... Ben saklı yordam içindeki sorgu kullanmayı denedim ama (vs .. vs GELEN BOŞ SEÇ ederse" kullanarak bir hata alıyorum?


şimdi, çalıştırabilirsiniz tek şey

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'; 

ve bu da

denedim
IF EXISTS (SELECT NULL FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = parm_key_name) THEN 
(...) do something (...) 
END IF; 

ama olsun bir 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

Ben basit sorgu ile forumlarda örnekler için baktım ve bu neden çalışmadığını anlamaya olamaz.

NOT: Düzenleme Sen Bilgi düzeni bağlanması gereken bozuk bir bağlantıyı

+1

Sorgunuz neye benziyor? –

+0

Özellikle "yabancı anahtarları bırak" ile ne demek istiyorsunuz? – gview

+0

@ GALER TABLOSU 'table' DROP FOREIGN KEY 'fk' gibi bir şey gör; –

cevap

5

düzeltmek ve bu tabloda birincil anahtar ve yabancı anahtarları hakkında tüm bilgileri bulabilirsiniz

SELECT * FROM information_schema.TABLE_CONSTRAINTS T;

size information_schema'a erişmek için ROOT kullanıcısı olmanız gerekir.

Bu tabloyu kullanarak tabloyu, db'yi ve yabancı anahtarın olup olmadığını bulabilirsiniz.

IF EXIST ve Saklı Yordam'ı kullanmak istemiyorsanız bu yardımcı olur. Ama eminim IF EXIST kullanamazsınız saklı yordam sorguları için kullanılabilir ....

+0

"[Y], information_schema'ya erişmek için bir ROOT kullanıcısı olmanız gerekir." Bu bilgiyi nereden buldunuz? – rstackhouse

+0

Bir kullanıcının yalnızca bilgi şemasının izinleri olduğu bölümü görüntüleyebileceğini söylemek daha doğru olur. Bir kullanıcı 'GRANT ALL' ile oluşturulduysa, o tablodaki izinleri görebilirler. – rstackhouse

1

Neden "INFORMATION_SCHEMA" tablosunu kullanmıyorsunuz?

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

Sen Bilgi düzeni bağlanması gereken ve bu tabloda birincil anahtar ve yabancı anahtarları hakkında tüm bilgileri bulabilirsiniz

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; 

YARDIM: Bu bağlantıyı list-foreign-keys-in-mysql

bkz
İlgili konular