Список обмежень з бази даних MySQL


91

Як отримати список усіх обмежень з певної бази даних?


1
У MySQL існує більше одного типу обмежень. Що ти маєш на увазі? Чи можете ви навести приклад того, що ви шукаєте?
— Марк Байерс,

Відповіді:


141

Використовуйте 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
Цей список буде включати лише УНІКАЛЬНІ, ПЕРВИННІ КЛЮЧІ або ЗОВНІШНІ обмеження. ПЕРЕВІРКА можлива, але не застосовується. За допомогою цього запиту обмеження 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 WHERE TABLE_NAME = "tabnam";


1
Це, наскільки мені відомо, в Oracle, а не в MySQL.
— Прадісен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.