Показати обмеження в команді таблиць


224

У мене є таблиці, на яких я намагався встановити стосунки PK FK, але хочу перевірити це. Як я можу показати обмеження PK / FK? Я бачив цю сторінку керівництва, але вона не містить прикладів, і мій пошук у Google також був безрезультатним. Моя база даних є, credentialing1а мої обмежені таблиці є practicesі cred_insurances.

Відповіді:


414

я використовую

SHOW CREATE TABLE mytable;

Це показує вам оператор SQL, необхідний для отримання mytableу своєму поточному вигляді. Ви можете бачити всі стовпці та їх типи (як DESC), але він також показує інформацію про обмеження (та тип таблиці, діаграму тощо).


8
я не думаю, що це показує майбутні стосунки FK? як, наприклад, a.col_one references b.col_oneі в show create table bне буде містити деталей про вищезазначене відношення.
Vineet Menon

1
Я підтвердив, що ця команда не відображає обмеження зовнішнього ключа.
Kemin Zhou

2
Остерігайтеся, що MariaDB, починаючи з 10.2, поверне тут неприємні результати. jira.mariadb.org/browse/MDEV-15377
stamster

117

Просто запитайте INFORMATION_SCHEMA:

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
Це найкраща відповідь, оскільки вона дає результат у форматі, який ви можете використовувати програмно. Звичайно, вам потрібно буде додати пункт WHERE, щоб звузити результати
Naveed Hasan

Це допомогло мені знайти пошкоджену таблицю, в якій стовпець 'id' посилався на кілька іноземних ключів. Недарма стіл отримав 1452 IntegrityError.
Vicky T

Це чудова відповідь! Дякуємо @ Resh32
simhumileco

Мені подобається, що ви відповіли префіксом "Просто". Хоча чудова відповідь!
leviathanbadger

Це не відображатиме фактичні правила обмеження - наприкладON UPDATE CASCADE
stamster

19

Основна проблема з підтвердженою відповіддю полягає в тому, що вам доведеться проаналізувати вихід, щоб отримати інформацію. Ось запит, що дозволяє отримати їх більш зручним способом:

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, щоб зробити запит information_schemaвам потрібні пільги. Якщо вам потрібен простий список клавіш, ви можете скористатися цією командою:

SHOW INDEXES IN <tablename>

Як телефонувати інформація_schema краща за це, дякую багато
Eiad Samman

6

Спробуйте зробити:

SHOW TABLE STATUS FROM credentialing1;

Обмеження закордонних ключів перераховано у стовпці Коментар виводу.


3
Я бачу лише коментарі до таблиці в колонці Коментар. Мабуть, це стосується типів InnoDB.
годинниковий годинник

1
Коментарі лише для коментарів користувачів. Це точно не місце, де зберігаються визначення FK! Якщо вони для вас - це, мабуть, було зроблено від вашого імені якимось інструментом RDBMS.
stamster

6

Ви можете скористатися цим:

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'

Або для кращого форматованого виводу використовуйте це:

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: таблиця або представлення не існує 00942. 00000 - "таблиця або перегляд не існує" * Причина: * Дія: Помилка в рядку: 29 Стовпець: 5 рядок 29 - "інформація_schema.key_column_usage"
немежа

2
@noboundaries Ви намагаєтеся це зробити в Oracle, питання про MySQL
ymajoros

1

Аналогічно @ Resh32 , але без необхідності використовувати USEоператор:

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;

Корисно, наприклад, використання ORM.


Це не відображатиме фактичні правила обмеження - наприкладON UPDATE CASCADE
stamster

0

Існує також інструмент, який оракул зробив під назвою mysqlshow

Якщо запустити його з --k keys $table_nameопцією, він відобразить клавіші.

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

приклад:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.