MySQL'de, belirli bir tabloya işaret eden tüm yabancı anahtar kısıtlamalarının bir listesini nasıl alabilirim? belirli bir sütun? Bu, bu Oracle sorusuyla aynı şey , ancak MySQL için.
MySQL'de, belirli bir tabloya işaret eden tüm yabancı anahtar kısıtlamalarının bir listesini nasıl alabilirim? belirli bir sütun? Bu, bu Oracle sorusuyla aynı şey , ancak MySQL için.
Yanıtlar:
Tablo için:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Bir Sütun için:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
Temel olarak, nerede yan tümcesinde REFERENCED_TABLE_NAME ile REFERENCED_COLUMN_NAME ile değiştirdik.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDIT: Yorumlarda belirtildiği gibi, bu OPs sorusuna doğru cevap değil, ama bu komutu bilmek yararlıdır. Bu soru Google'da aradığım şey için ortaya çıktı ve bu cevabı diğerlerinin bulması için bırakacağımı düşündüm.
SHOW CREATE TABLE `<yourtable>`;
Bu yanıtı burada buldum: MySQL: Tablolar komutunda kısıtlamaları göster
Bu şekilde ihtiyacım vardı çünkü FK'nin var olup olmadığını görmek yerine FK'nin nasıl çalıştığını görmek istedim.
<yourtable>
değil, içindeki tüm kısıtlamaları gösterir <yourtable>
.
display foreign keys mysql
Google'da ilk sonucudur , nedeni bu olabilir;)
InnoDB ve tanımlanmış FK'leri kullanıyorsanız, information_schema veritabanını sorgulayabilirsiniz, örneğin:
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';
Yararlı bilgiler eklemek için eski bir yanıtta yayın.
Benzer bir sorunum vardı, ancak REFERENCED tablo ve sütun adları ile birlikte CONSTRAINT_TYPE görmek istedim. Yani,
Masanızdaki tüm FK'leri görmek için:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
Şemanızdaki tüm tabloları ve FK'leri görmek için:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
Veritabanınızdaki tüm FK'leri görmek için:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
Hatırlamak!
Bu InnoDB depolama motorunu kullanıyor. Bunları ekledikten sonra göstermek için herhangi bir yabancı anahtar alamıyorsanız, büyük olasılıkla tablolarınız MyISAM kullanıyor olabilir.
Kontrol etmek:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Düzeltmek için şunu kullanın:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Düğümün cevabına alternatif olarak, InnoDB ve tanımlanmış FK'leri kullanırsanız, information_schema veritabanını sorgulayabilirsiniz:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
<table> 'dan gelen yabancı anahtarlar için veya
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
<table> tuşlarına yabancı anahtarlar için
İsterseniz UPDATE_RULE ve DELETE_RULE dosyalarını da edinebilirsiniz.
Bu çözüm sadece tüm ilişkileri değil, aynı zamanda bazı durumlarda gerekli olan kısıtlama adını da gösterecektir (örn. Bırakma kontratı):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
Belirli bir veritabanındaki tabloları kontrol etmek istiyorsanız, sorgunun sonuna şema adını ekleyin:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
Benzer şekilde, belirli bir sütun adı için
ve tablo_adı = 'tablo_adı
sorgusunun sonunda.
Buradaki gönderiden esinlenerek
Kullanarak FK'lerinizi (Yabancı Anahtar referansları) listelemenin hızlı bir yolu
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Bu sorgu, kısıtlamaların ve tüm başvurulan ve başvuru tablolarının aynı şemada olduğunu varsayar.
Kendi yorumunuzu ekleyin.
Kaynak: resmi mysql el kitabı.
Geldiğim çözüm kırılgandır; django'nun yabancı anahtarlar için adlandırma kuralına dayanıyor.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Sonra, kabuğun içinde,
grep 'refs_tablename_id' mysql_output
Belirli bir yabancı anahtar içeren tüm tabloları bulmak gibiemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Yabancı anahtar sütununun adını da almak istiyorsanız:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;