Я хотел аа которая позволила бы мне найти все столбцы «Key» и «ID», имеющие/отсутствующие ограничения. Поэтому мне нужны все столбцы по сравнению со списком всех PK OR FK ИЛИ Null, вот мой запрос. Надеюсь, это поможет кому-то еще!
SELECT
c.table_schema
,c.table_name
,c.column_name
,KeyConstraints.constraint_type
,KeyConstraints.constraint_schema
,KeyConstraints.constraint_name
,KeyConstraints.referenced_table_schema
,KeyConstraints.referenced_table_name
,KeyConstraints.referenced_column_name
,KeyConstraints.update_rule
,KeyConstraints.delete_rule
FROM information_schema.columns AS c
LEFT JOIN
(
SELECT
FK.table_schema AS TABLE_SCHEMA
,FK.table_name
,CU.column_name
,FK.constraint_type
,c.constraint_schema
,C.constraint_name
,PK.table_schema AS REFERENCED_TABLE_SCHEMA
,PK.table_name AS REFERENCED_TABLE_NAME
,CCU.column_name AS REFERENCED_COLUMN_NAME
,C.update_rule
,C.delete_rule
FROM information_schema.referential_constraints AS C
INNER JOIN information_schema.table_constraints AS FK
ON C.constraint_name = FK.constraint_name
INNER JOIN information_schema.table_constraints AS PK
ON C.unique_constraint_name = PK.constraint_name
INNER JOIN information_schema.key_column_usage AS CU
ON C.constraint_name = CU.constraint_name
INNER JOIN information_schema.constraint_column_usage AS CCU
ON PK.constraint_name = CCU.constraint_name
WHERE (FK.constraint_type = 'FOREIGN KEY')
UNION
SELECT
ccu.table_schema
,ccu.table_name
,ccu.column_name
,tc.constraint_type
,ccu.constraint_schema
,ccu.constraint_name
,NULL
,NULL
,NULL
,NULL
,NULL
FROM information_schema.constraint_column_usage ccu
INNER JOIN information_schema.table_constraints tc
ON ccu.table_schema = tc.table_schema
AND ccu.table_name = tc.table_name
WHERE tc.constraint_type = 'PRIMARY KEY'
) AS KeyConstraints
ON c.table_schema = KeyConstraints.table_schema
AND c.table_name = KeyConstraints.table_name
AND c.column_name = KeyConstraints.column_name
WHERE c.column_name LIKE '%ID' OR c.column_name LIKE '%Key'
ORDER BY c.table_schema
,c.table_name
,c.column_name
;
форматирования любезность: http://www.dpriver.com/pp/sqlformat.htm
Внимание! - Это не возвращает fks, которые ссылаются на уникальные столбцы индекса. См. Http://stackoverflow.com/questions/2895219/can-we-have-a-foreign-key-which-is-not-a-primary-key-in-any-other-table. –
@Seth Reno: Это правильно в Microsoft SQL Server, потому что там вы можете ссылаться на уникальный индекс во внешнем ключе. Но SQL-стандарт не позволяет этого, и это не поддерживается всеми другими СУБД. Кроме того, в information_schema нет информации об индексе, поэтому нет возможности исправить это. Я бы сказал, если вы не ссылаетесь на первичный ключ как на внешний ключ, вы делаете что-то неправильно схематично. –
Этот запрос почти корректно работает для меня. Мне пришлось добавить 'AND KCU2.TABLE_NAME = RC.REFERENCED_TABLE_NAME' в предложение ON для KCU2 JOIN, чтобы исключить неверные записи из-за большого количества таблиц в моей базе данных с первичным ключом с именем' PRIMARY'. Я запускаю MariaDB 5.5, но я подозреваю, что у другой СУБД будет аналогичная проблема. – JSmitty