Как стать автором
Поиск
Написать публикацию
Обновить

MySQL получение блокирующих ограничений(констреинтов) при удалении записей, мини HowTo

Время на прочтение2 мин
Количество просмотров801
Иногда, не буду говорить что часто, скорее даже редко, возникает обозначенная задача, узнать — записи в каких таблицах блокируют удаление текущей записи, своими внешними ссылками.


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 работают с данными из этой БД (разными подсхемами), на БД натянута проверка ссылочной целостности средствам БД, пользователи попросили при выводе ошибки о невозможности удаления записи на которую есть ссылки также указывать эти ссылки.
Теги:
Хабы:
Всего голосов 10: ↑4 и ↓6-2
Комментарии8

Публикации

Ближайшие события