Как найти все отношения между всеми таблицами mysql?
Как найти все отношения между всеми таблицами MySQL? Если, например, я хочу знать отношение таблиц в базе данных, содержащих около 100 таблиц.
Есть ли вообще знать это?
Ответы
Ответ 1
Лучший способ, программно говоря, собирать данные из таблицы INFORMATION_SCHEMA.KEY_COLUMN_USAGE следующим образом:
SELECT
`TABLE_SCHEMA`, -- Foreign key schema
`TABLE_NAME`, -- Foreign key table
`COLUMN_NAME`, -- Foreign key column
`REFERENCED_TABLE_SCHEMA`, -- Origin key schema
`REFERENCED_TABLE_NAME`, -- Origin key table
`REFERENCED_COLUMN_NAME` -- Origin key column
FROM
`INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` -- Will fail if user don't have privilege
WHERE
`TABLE_SCHEMA` = SCHEMA() -- Detect current schema in USE
AND `REFERENCED_TABLE_NAME` IS NOT NULL; -- Only tables with foreign keys
Здесь больше информации о колонках, например ORDINAL_POSITION, которая может быть полезна в зависимости от вашей цели.
Дополнительная информация: http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table.html
Ответ 2
Попробуйте следующее:
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
Ответ 3
Try
ВЫБЕРИТЕ
`TABLE_NAME`,
`COLUMN_NAME`,
`REFERENCED_TABLE_NAME`,
`REFERENCED_COLUMN_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_SCHEMA` = 'YOUR_DATABASE_NAME' И
`REFERENCED_TABLE_SCHEMA` НЕ НУЛЛ И
`REFERENCED_TABLE_NAME` не является NULL и
`REFERENCED_COLUMN_NAME` НЕ НУЛЛ
не забудьте заменить YOUR_DATABASE_NAME своим именем базы данных!
Ответ 4
Быстрый метод визуализации связей в MySQL - это обратное проектирование базы данных с помощью MySQL Workbench.
Это можно сделать и с помощью обратной инженерии, которая приведет к диаграмме сущностей-отношений, которая будет похожа на следующую (хотя вам, возможно, придется ее самостоятельно организовать после ее создания):
![ERD]()
Ответ 5
SELECT
count(1) totalrelationships ,
c.table_name tablename,
CONCAT(' ',GROUP_CONCAT(c.column_name ORDER BY ordinal_position SEPARATOR ', ')) columnname,
CONCAT(' ',GROUP_CONCAT(c.column_type ORDER BY ordinal_position SEPARATOR ', ')) columntype
FROM
information_schema.columns c RIGHT JOIN
(SELECT column_name , column_type FROM information_schema.columns WHERE
-- column_key in ('PRI','MUL') AND -- uncomment this line if you want to see relations only with indexes
table_schema = DATABASE() AND table_name = 'YourTableName') AS p
USING (column_name,column_type)
WHERE
c.table_schema = DATABASE()
-- AND c.table_name != 'YourTableName'
GROUP BY tablename
-- HAVING (locate(' YourColumnName',columnname) > 0) -- uncomment this line to search for specific column
ORDER BY totalrelationships desc, columnname
;
Ответ 6
вы можете использовать:
SHOW CREATE TABLE table_name;
Ответ 7
Один из вариантов: вы можете сделать обратное проектирование, чтобы понять его схематически.
Когда вы устанавливаете MySQL, вы получите MySQLWorkbench. Вам нужно открыть его и выбрать базу данных, которую вы хотите перепроектировать. Нажмите опцию "Обратный инженер" где-нибудь, что вы найдете в меню "Инструменты" или "База данных". Он попросит вас выбрать таблицы. Либо вы выбираете таблицы, которые хотите понять, либо выбираете всю БД. Он будет генерировать диаграмму с отношениями.
Ответ 8
1) Зайдите в свою базу данных:
use DATABASE;
2) Показать все таблицы:
show tables;
3) Посмотрите на каждый столбец таблицы, чтобы собрать, что он делает и что он сделал:
describe TABLENAME;
4) Опишите хорошо, поскольку вы можете точно определить, что делают ваши столбцы таблицы, но если вы хотите еще более внимательно рассмотреть сами данные:
select * from TABLENAME
Если у вас большие таблицы, то каждая строка обычно имеет id
, и в этом случае мне нравится делать это, чтобы просто получить несколько строк данных и не перегружать терминал:
select * from TABLENAME where id<5
- Вы можете поместить любое условие, которое вам нравится.
Этот метод дает вам больше информации, чем просто делать select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
, а также предоставляет вам дополнительную информацию об размеру укуса каждый раз.
ИЗМЕНИТЬ
Как и предполагалось, вышеприведенный WHERE id < 5
был плохим выбором в качестве условного заполнителя. Не рекомендуется ограничивать идентификационный номер, тем более, что идентификатор обычно не заслуживает доверия, чтобы быть последовательным. Вместо этого добавьте LIMIT 5
в конце запроса.