Команда Показать ограничения на таблицы

224

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

Капитан Хлопок
источник

Ответы:

414

я использую

SHOW CREATE TABLE mytable;

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

Адриан Смит
источник
8
я не думаю, что это показывает входящие отношения ФК? как, например, a.col_one references b.col_oneи show create table bне будет содержать подробностей о вышеупомянутом отношении.
Вине Менон
1
Я подтвердил, что эта команда не отображает ограничение внешнего ключа.
Кемин Чжоу
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;
Resh32
источник
14
Это лучший ответ, потому что он дает вам результат в формате, который вы можете использовать программно. Конечно, вам нужно будет добавить предложение WHERE, чтобы сузить результаты
Naveed Hasan
Это помогло мне найти поврежденную таблицу, в которой столбец «id» ссылался на несколько внешних ключей. Не зря столик получил 1452 IntegrityError.
Vicky T
Это отличный ответ! Спасибо @ Resh32
simhumileco
Мне нравится, что вы добавили в свой ответ «Просто». Отличный ответ, хотя!
Левиафанбаджер
Это не будет отображать реальные правила ограничений - например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"
nfroidure
источник
11

afaik, чтобы сделать запрос, information_schemaвам нужны привилегии. Если вам нужен простой список ключей, вы можете использовать эту команду:

SHOW INDEXES IN <tablename>
pleerock
источник
Как называется информационная_схема лучше, чем это, большое спасибо
Эйад Самман
6

Попробуйте сделать:

SHOW TABLE STATUS FROM credentialing1;

Ограничения внешнего ключа перечислены в столбце « Комментарий» выходных данных.

codaddict
источник
3
Я вижу только комментарии к таблице в столбце Комментарий. Вероятно, это как-то связано с типами InnoDB.
Clockworkgeek
1
Комментарии только для комментариев пользователей. Это точно не место, где хранятся определения FK! Если они для вас - это должно быть сделано от вашего имени каким-то инструментом СУБД.
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 - «information_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.

simhumileco
источник
Это не будет отображать реальные правила ограничений - например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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
GardenRouteGold
источник