Belirli table.column'a başvuran yabancı anahtarları olan ve bu yabancı anahtarlar için değerleri olan tüm tablolar nasıl bulunur?


272

Birincil anahtarı yabancı anahtar olarak diğer bazı tablolarda başvurulan bir tablo var. Örneğin:

  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

Şimdi, veritabanında Y ve Z gibi X içine yabancı anahtarlar içeren kaç tablo var bilmiyorum. Geri dönmek için kullanabileceğiniz bir SQL sorgusu var:

  1. X'e yabancı anahtarlar içeren tabloların listesi
  2. VE bu tablolardan hangisinin aslında yabancı anahtarda değerleri var

Yanıtlar:


384

Hadi bakalım:

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

Benzer tablolara / sütun adlarına sahip birden çok veritabanınız varsa, sorgunuzu belirli bir veritabanıyla da sınırlandırmak isteyebilirsiniz:

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';

7
SELECT TABLE_NAME, SELECT * 'den daha iyi
zloctb

Bu ne tür DB için yararlıdır? MySQL?
Cirelli94

2
@ Cirelli94 Soru bir MySQL sorusu olarak etiketlendi.
mikeschuld

61

MySQL 5.5 Başvuru Kılavuzu: "InnoDB ve FOREIGN KEY Kısıtlamaları"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;

21

Bu çözüm yalnızca tüm ilişkileri değil, aynı zamanda bazı durumlarda gerekli olan kısıtlama adını da görüntüler (örn. Bırakma kısıtlaması):

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, aşağıdakileri ekleyin:

AND table_schema = 'database_name';

15

Şema ile ilgili tüm bilgileri akıllıca adlandırılmış information_schematabloda bulabilirsiniz.

Tabloyu kontrol etmek isteyebilirsiniz REFERENTIAL_CONSTRAINTSve KEY_COLUMN_USAGE. Birincisi, size hangi tabloların başkaları tarafından referans verildiğini söyler; ikincisi size alanlarının nasıl ilişkili olduğunu söyleyecektir.


5

Açıklama da dahil olmak üzere bir db içindeki tüm yabancı anahtarları listeleme

    SELECT  
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM   
    information_schema.KEY_COLUMN_USAGE AS i1  
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
    AND  i1.TABLE_SCHEMA  ='db_name';

tablo tablosundaki belirli bir sütunla kısıtlama

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

3

Dostça bir çıktı almak için bir senaryoya yazabileceğiniz küçük bir bash onliner yazdım :

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./'

Yani yürütme: mysql_references_to transaccion(burada işlem rastgele bir tablo adıdır) böyle bir çıktı verir:

carrito_transaccion.transaccion_id
comanda_detalle.transaccion_id
comanda_detalle_devolucion.transaccion_positiva_id
comanda_detalle_devolucion.transaccion_negativa_id
comanda_transaccion.transaccion_id
cuenta_operacion.transaccion_id
...

-4

En kolay:
1. Açık phpMyAdmin
2. Sol tıklama veritabanı adı
3. Sağ üst köşede "Tasarımcı" sekmesini bulun

Tüm kısıtlamalar burada gösterilecektir.

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.