Список ограничений из базы данных 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.