Список обмежень з бази даних 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.