Як в MySQL я можу отримати список усіх обмежень зовнішніх ключів, що вказують на певну таблицю? конкретний стовпець? Це те саме, що це питання про Oracle , але для MySQL.
Як в MySQL я можу отримати список усіх обмежень зовнішніх ключів, що вказують на певну таблицю? конкретний стовпець? Це те саме, що це питання про Oracle , але для MySQL.
Відповіді:
Для таблиці:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Для стовпця:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
В основному ми змінили REFERENCED_TABLE_NAME на REFERENCED_COLUMN_NAME у пункті, де.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDIT: Як зазначено в коментарях, це не є правильною відповіддю на питання ОП, але корисно знати цю команду. Це питання з’явилося в Google для того, що я шукав, і подумав, що я залишу цю відповідь для інших.
SHOW CREATE TABLE `<yourtable>`;
Я знайшов цю відповідь тут: MySQL: показати обмеження в команді таблиць
Мені знадобився цей шлях, тому що я хотів побачити, як функціонує ФК, а не просто бачити, чи існує він чи ні.
<yourtable>
, а не всі обмеження, на які вказує <yourtable>
.
display foreign keys mysql
в google, можливо, тому;)
Якщо ви використовуєте InnoDB та визначені FK, ви можете запитати базу даних data_schema, наприклад:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
Публікація за старою відповіддю, щоб додати корисну інформацію.
У мене була подібна проблема, але я також хотів побачити CONSTRAINT_TYPE разом із НАЗВАННЯМИ таблиці та стовпці REFERENCED. Тому,
Щоб побачити всі FK в таблиці:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
Щоб побачити всі таблиці та FK у вашій схемі:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
Щоб побачити всі ФК у вашій базі даних:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
Пам'ятайте!
Для цього використовується механізм зберігання InnoDB. Якщо вам не здається отримати жодних сторонніх ключів після їх додавання, можливо, у ваших таблицях використовується MyISAM.
Перевіряти:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Щоб виправити, скористайтеся цим:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Як альтернатива відповіді Node, якщо ви використовуєте InnoDB та визначені FK, ви можете запитати базу даних information_schema, наприклад:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
для зовнішніх ключів від <table> або
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
для зовнішніх ключів до <table>
Ви також можете отримати UPDATE_RULE та DELETE_RULE, якщо бажаєте.
Це рішення не тільки відображатиме всі відносини, але і ім'я обмеження, яке потрібно в деяких випадках (наприклад, втратити контракт):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
Якщо ви хочете перевірити таблиці в певній базі даних, в кінці запиту додайте ім'я схеми:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
Аналогічно для конкретного імені стовпця додайте
і table_name = 'ім'я_стол
в кінці запиту.
Натхненний цій посаді тут
Швидкий спосіб перерахувати ваші FK (посилання іноземного ключа) за допомогою
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Цей запит передбачає, що обмеження та всі посилаються та посилаються таблиці знаходяться в одній схемі.
Додайте власний коментар.
Джерело: офіційний посібник з mysql.
Рішення, яке я придумав, є крихким; вона покладається на конвенцію про іменування джанго для іноземних ключів.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Потім в оболонці
grep 'refs_tablename_id' mysql_output
Щоб знайти всі таблиці, що містять певний зовнішній ключ, такий якemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Якщо ви також хочете отримати назву стовпця із зовнішнім ключем:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;