Иногда, не буду говорить что часто, скорее даже редко, возникает обозначенная задача, узнать — записи в каких таблицах блокируют удаление текущей записи, своими внешними ссылками.
1. Вам нужна версия MySQL выше 5.1.16, именно начиная с этой версии, в служебной БД information_schema появилась таблица с описанием констреинтов REFERENTIAL_CONSTRAINTS
2. Искомый запрос, ради которого и писался данный пост:
Тут мы выбираем таблицы и их внешние ключи, кторые имеют RESTRICT DELETE_RULE на текущую таблицу.
П.С. Ошибку констреинта, для которой этот огород городился я, в PHP (PDO) ловлю следующим образом:
П.П.С
Живое применения когда это понадобилось:
Текущая схема БД включает 55 таблиц с большим ветвлением (схема много раз дорабатывалась за 3 года жизни), 4 клиентских приложения типа CMF работают с данными из этой БД (разными подсхемами), на БД натянута проверка ссылочной целостности средствам БД, пользователи попросили при выводе ошибки о невозможности удаления записи на которую есть ссылки также указывать эти ссылки.
1. Вам нужна версия MySQL выше 5.1.16, именно начиная с этой версии, в служебной БД information_schema появилась таблица с описанием констреинтов REFERENTIAL_CONSTRAINTS
2. Искомый запрос, ради которого и писался данный пост:
SELECT
information_schema.referential_constraints.table_name,
information_schema.key_column_usage.column_name
FROM
information_schema.referential_constraints
INNER JOIN information_schema.key_column_usage ON information_schema.key_column_usage.constraint_schema = information_schema.referential_constraints.constraint_schema AND information_schema.key_column_usage.constraint_name = information_schema.referential_constraints.constraint_name
WHERE
information_schema.referential_constraints.constraint_schema = schema() AND
delete_rule = 'RESTRICT' AND
information_schema.referential_constraints.referenced_table_name = :table
Тут мы выбираем таблицы и их внешние ключи, кторые имеют RESTRICT DELETE_RULE на текущую таблицу.
П.С. Ошибку констреинта, для которой этот огород городился я, в PHP (PDO) ловлю следующим образом:
try
{
// do pdo execute()
} catch (Exception $e) {
/**
* Find constraints error
*/
if (
(strpos($e->getMessage(), 'SQLSTATE[HY000]') !== false && strpos($e->getMessage(), 'General error: 1451')) ||
(strpos($e->getMessage(), 'SQLSTATE[23000]') !== false && strpos($e->getMessage(), 'Integrity constraint violation: 1451'))
)
{
// look for constraints
}
}
П.П.С
Живое применения когда это понадобилось:
Текущая схема БД включает 55 таблиц с большим ветвлением (схема много раз дорабатывалась за 3 года жизни), 4 клиентских приложения типа CMF работают с данными из этой БД (разными подсхемами), на БД натянута проверка ссылочной целостности средствам БД, пользователи попросили при выводе ошибки о невозможности удаления записи на которую есть ссылки также указывать эти ссылки.