MySQL: Bir tabloyla ilgili yabancı anahtarlar nasıl kontrol edilir?


43

MySQL'de tabloyla ilgili yabancı anahtarlar nasıl görünür?

Arka plan : MySQL'de yabancı anahtar kısıtlaması olan bir masa bırakmak istedim. Bunu yaptığımda şunu anlıyorum:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

Tablodan ilgili yabancı anahtarları başkalarını bırakarak nasıl bırakabilirim.

Yanıtlar:


55

Öncelikle, FOREIGN KEYkısıtlama adınızı şu şekilde öğrenin :

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'My_Table';

Ve sonra, belirtilen kısıtlamayı aşağıdaki şekilde kaldırabilirsiniz:

ALTER TABLE My_Table DROP FOREIGN KEY My_Table_Constraint;

Kaynaklar: 1 ve 2 .

Yorumlarda @SteffenWinkler tarafından önerildiği gibi, farklı şemalarda / veritabanlarında bu ismin birden fazla tablosu varsa, nerede olduğunu belirtmek için başka bir tahmin ekleyebilirsiniz:

AND TABLE_SCHEMA = 'My_Database';

1
Düzenleme için teşekkürler - Ben sorunuzu + 1'le karşılık veriyorum! :-)
Vérace

16
Ayrıca SHOW CREATE TABLE My_Table;,.
Rick James,

2
Yalnızca sahip olan diğer tablolardaki kısıtlamaları gösteren @RickJames My_Table. Soru My_Table, diğer tablolardaki kısıtları soruyor .
ADTC

2
sadece bu konuya bakan insanlar için: Bu ifade, tüm veritabanı sunucusu genelinde belirtilen ada göre bir tabloya atıfta bulunan tüm kısıtlamaları listeler. Ekleyerek ilgili veritabanına ekleyinAND TABLE_SCHEMA = 'My_Database';
Steffen Winkler

3

Yukarıdaki Sorguyu düzenledi. Başvuru Edilen Tablo Adı Tablo Adı olarak Referans Olarak Değiştirildi Tablo adı, başvurulan tablodur ve bu nedenle orijinal sorgunun sonucu, tablonuzdaki yabancı anahtarları size göstermez.

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  Table_name = 'case_qualitycontrolcase' and constraint_name = f
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.