2010-10-23 17 views
162

PK FK ilişkilerini ayarlamayı denediğim tablolar var ancak bunu doğrulamak istiyorum. PK/FK sınırlamalarını nasıl gösterebilirim? this manuel sayfasını gördüm, ancak örnekleri göstermiyor ve google arama da sonuçsızdı. Veritabanım kimlik bilgisi1 ve kısıtlı tablolarım uygulamalar ve cred_insurances. yapıyorTablolar üzerinde kısıtlamaları göster komutu

cevap

321

Ben Bu, mevcut haliyle mytable receate için gerekli SQL deyimi gösterir

SHOW CREATE TABLE mytable; 

kullanın. Tüm sütunları ve türlerini (DESC gibi) görebilirsiniz, ancak aynı zamanda kısıtlama bilgilerini (ve tablo türü, karakter kümesi vb.) Gösterir.

USE INFORMATION_SCHEMA; 
SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "<your_database_name>" 
     AND TABLE_NAME = "<your_table_name>" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 
+6

Gelen fk ilişkilerini göstermeyi düşünmüyorum? Örneğin, “a.col_one b.col_one” referansları ve “show table b” ifadesi, yukarıda bahsedilen ilişki hakkında ayrıntı içermeyecektir. –

+1

Bu komutun yabancı anahtar kısıtlamasını göstermediğini doğruladım. –

+0

MariaDB'nin 10 ile başladığına dikkat edin.2 burada garip sonuçlara dönecektir. https://jira.mariadb.org/browse/MDEV-15377 – stamster

6

Dene:

SHOW TABLE STATUS FROM credentialing1; 

yabancı anahtar kısıtlamaları çıktı Yorum sütununda listelenir.

+3

Açıklama sütununda yalnızca tablo yorumlarını görüyorum. Bu muhtemelen InnoDB tipleri ile ilgili bir şeydir. – clockworkgeek

+0

Yorumlar sadece kullanıcı yorumları içindir. Elbette FK tanımlarının saklandığı yer değil! Onlar sizin için iseniz - bazı RDBMS aracı tarafından sizin adınıza yapılmış olması gerekir. – stamster

80

Basitçe INFORMATION_SCHEMA sorgulamak

select 
    table_name,column_name,referenced_table_name,referenced_column_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 

Ya da daha biçimlendirilmiş çıktı kullanılmak üzere

bu:

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 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 
+7

Bu, en iyi yanıttır çünkü size programlı olarak kullanabileceğiniz bir biçimde sonuç verir. Tabii ki sonuçları daraltmak için bir WHERE yan tümcesi eklemeniz gerekecek –

+0

Bu, 'yabancı' anahtarını gösteren birkaç bozuk anahtar içeren bozuk bir tablo bulmama yardımcı oldu. Şaşılacak bir tablo yok 1452 IntegrityError. –

+0

Bu harika bir cevap! Teşekkür @ Resh32 – simhumileco

5

Bu kullanabilirsiniz:

+0

ORA-00942 AÇIK: Tablo veya Görünüm yok 00942. 00000 - "tablo veya görünümü yok" * Neden: * Eylem: Line'da Hata: 29 Kolon: 5 29. satır Eğer Oracle o çalışıyoruz "information_schema.key_column_usage" – noboundaries

+2

@noboundaries, soru – ymajoros

15

valide cevapla temel sorun bilgileri almak için çıktıyı ayrıştırmak zorunda kalacaksınız.

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION, 
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE, 
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH, 
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE, 
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA, 
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME, 
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE, 
    links.TABLE_NAME, links.COLUMN_NAME, 
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE 
FROM INFORMATION_SCHEMA.`COLUMNS` as cols 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs 
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.TABLE_NAME=cols.TABLE_NAME 
    AND refs.COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs 
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links 
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME 
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks 
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME 
WHERE cols.TABLE_SCHEMA=DATABASE() 
    AND cols.TABLE_NAME="table" 
6

afaik sen ayrıcalıkları gerek information_schema bir istek yapmak için: Burada daha kullanışlı bir şekilde onları almak için izin veren bir sorgu olduğunu. Eğer tuşlarının basit bir liste gerekiyorsa bu komutu kullanabilirsiniz:

SHOW INDEXES IN <tablename> 
+0

sayesinde –

+0

Nasıl aradığını information_schema bu daha iyidir benim için çalıştı yaklaşık MySQL –

+0

Serin sayesinde çok teşekkürler, bu en iyi –

0

bunu anahtarları gösterecektir --k keys $table_name seçeneğiyle çalıştırın Eğer oracle mysqlshow

denilen yapılan bir araç da vardır.

SYNOPSIS 
    mysqlshow [options] [db_name [tbl_name [col_name]]] 
....... 
....... 
....... 
· --keys, -k 
    Show table indexes. 

örnek:

╰─➤ mysqlshow -h 127.0.0.1 -u root -p --keys database tokens 
Database: database Table: tokens 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| Field   | Type    | Collation   | Null | Key | Default | Extra   | Privileges      | Comment | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| id    | int(10) unsigned |     | NO | PRI |   | auto_increment | select,insert,update,references |   | 
| token   | text    | utf8mb4_unicode_ci | NO |  |   |    | select,insert,update,references |   | 
| user_id   | int(10) unsigned |     | NO | MUL |   |    | select,insert,update,references |   | 
| expires_in  | datetime   |     | YES |  |   |    | select,insert,update,references |   | 
| created_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
| updated_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| tokens | 0   | PRIMARY     | 1   | id   | A   | 2   |   |  |  | BTREE  |   |    | 
| tokens | 1   | tokens_user_id_foreign | 1   | user_id  | A   | 2   |   |  |  | BTREE  |   |    | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
0

@Resh32 benzer şekilde, ancak USE deyimi kullanmaya gerek kalmadan:

SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "database_name" 
     AND TABLE_NAME = "table_name" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 

yararlı, örneğin ORM kullanarak.

+0

olduğunu olmasıdır yani gerçek kısıtlama kurallarını göstermez - örn. GÜNCELLEME CASCADE ' – stamster