Список ограничений из базы данных MySQL


92

Как мне получить список всех ограничений из конкретной базы данных?


1
В MySQL существует более одного типа ограничений. Что ты имеешь в виду? Можете ли вы привести пример того, что вы ищете?
— Марк Байерс,

Ответы:


146

Используйте information_schema.table_constraintsтаблицу, чтобы получить имена ограничений, определенных для каждой таблицы:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

Используйте information_schema.key_column_usageтаблицу, чтобы получить поля в каждом из этих ограничений:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

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

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
Этот список будет включать только ограничения UNIQUE, PRIMARY KEY или FOREIGN KEY. ПРОВЕРИТЬ возможно, но не принудительно. Ограничения DEFAULT не будут видны при использовании этого запроса.
— OMG Ponies

MySQL не хранит ограничения CHECK. Если вы попытаетесь определить один, он проанализирует его и автоматически отбросит.
— Билл Карвин,

1
Значение DEFAULT не считается ограничением. Он хранится в формате information_schema.columns.column_default.
— Билл Карвин,

22

Отличный ответ от @Senseful.

Я представляю модифицированный запрос для тех, кто ищет только список имен ограничений (а не другие детали / столбцы):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
если вам нужно удалить один, как только вы его найдете, см. здесь stackoverflow.com/a/838412/2401804
— r3wt

9

Это действительно помогает, если вы хотите увидеть ограничения первичного и внешнего ключей, а также правила для этих ограничений, такие как ON_UPDATE и ON_DELETE, а также имена столбцов и внешних столбцов вместе:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

Возможно, вы даже захотите добавить дополнительную информацию об этих столбцах, просто добавьте это в SQL (и выберите нужные столбцы):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

-3

ВЫБЕРИТЕ * ОТ USER_CONSTRAINTS, ГДЕ TABLE_NAME = "tabnam";


1
Насколько я знаю, это в Oracle, а не в MySQL.
— Pradyumn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.