Tablolar komutunda kısıtlamaları göster


224

PK FK ilişkilerini ayarlamaya çalıştığım tablolarım var ama bunu doğrulamak istiyorum. PK / FK sınırlamalarını nasıl gösterebilirim? Bu manuel sayfayı gördüm , ancak örnekler göstermiyor ve google aramam da sonuçsuz kaldı. Veritabanım credentialing1ve kısıtlanmış tablolarım practicesve cred_insurances.

Yanıtlar:


414

kullanırım

SHOW CREATE TABLE mytable;

Bu, mytablegeçerli biçiminde tekrarlamak için gerekli SQL deyimini gösterir . Tüm sütunları ve türlerini görebilirsiniz (gibi DESC) ancak aynı zamanda size kısıtlama bilgilerini (ve tablo türünü, karakter kümesini vb.) Gösterir.


8
Gelen fk ilişkilerini gösterdiğini sanmıyorum? örneğin, a.col_one references b.col_oneve içinde olduğu gibi show create table b, yukarıda bahsedilen ilişki hakkında ayrıntı içermeyecektir.
Vineet Menon

1
Bu komutun yabancı anahtar kısıtlamasını görüntülemediğini doğruladım.
Kemin Zhou

2
10.2 ile başlayan MariaDB'nin burada garip sonuçlar getireceğine dikkat edin. jira.mariadb.org/browse/MDEV-15377
stamster

117

BİLGİ_SCHEMA'yı sorgulamanız yeterlidir:

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;

14
Bu en iyi yanıttır, çünkü sonucu programlı olarak kullanabileceğiniz bir biçimde verir. Fıkra sonuçları daraltmak için NEREDE Tabii bir eklemeniz gerekecektir
Naveed Hasan

Bu, birkaç yabancı anahtar için 'id' sütununa sahip bozuk bir tablo bulmama yardımcı oldu. Masada 1452 IntegrityError var.
Vicky T

Bu harika bir cevap! Thanks @ Resh32
simhumileco

Cevabınızı "Basitçe" ile ön eklediğinizi seviyorum. Yine de harika bir cevap!
leviathanbadger

Gerçek kısıtlama kuralları görüntülenmez - örneğinON UPDATE CASCADE
stamster

19

Doğrulanmış cevapla ilgili temel sorun, bilgileri almak için çıktıyı ayrıştırmak zorunda kalacağınızdır. Bunları daha kullanışlı bir şekilde elde etmenizi sağlayan bir sorgu:

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"

11

afaik'ten bir talepte bulunmak için information_schemaayrıcalıklara ihtiyacınız var. Basit anahtar listesine ihtiyacınız varsa bu komutu kullanabilirsiniz:

SHOW INDEXES IN <tablename>

Information_schema nasıl
çağırılır

6

Yapmayı dene:

SHOW TABLE STATUS FROM credentialing1;

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


3
Yorum sütununda yalnızca tablo yorumlarını görüyorum. Muhtemelen InnoDB tipleriyle ilgilidir.
clockworkgeek

1
Yorumlar yalnızca kullanıcı yorumları içindir. Bu kesinlikle FK tanımlarının saklandığı yer değil! Onlar sizin için - sizin adınıza bazı RDBMS aracı tarafından yapılmış olmalıdır.
stamster

6

Bunu kullanabilirsiniz:

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'

Veya daha iyi biçimlendirilmiş çıktılar için şunu kullanın:

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'

ORA-00942: tablo veya görünüm mevcut değil 00942. 00000 - "tablo veya görünüm mevcut değil" * Neden: * Eylem:
Satırdaki

2
@noboundaries Oracle üzerinde çalışıyorsun, soru MySQL hakkında
ymajoros

1

@ Resh32'ye benzer , ancak USEifadeyi 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 kullanma.


Gerçek kısıtlama kuralları görüntülenmez - örneğinON UPDATE CASCADE
stamster

0

Kahin denilen bir araç da var mysqlshow

--k keys $table_nameSeçeneği ile çalıştırırsanız , tuşları görüntüler.

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

misal:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
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.