Pull to refresh

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

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


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

Articles