MySQL. Удаление внешнего ключа из таблицы

Не работает такой подход?

mysql> alter table `<Название таблицы>` 
    -> drop foreign key `<Название столбца>`;

Выдает что-то наподобие этого?

ERROR 1025 (HY000): Error on rename of 
'./database/table' to './database/#sql2-3ac-7e' (errno: 152)

Тогда эта статья для Вас.

Как исправить ситуацию?

  1. Открываем системную базу данных information_schema.
    mysql> 
    use `information_schema`;
  2. Ищем в ней нужный нам ключ (который хотим удалить). Описываем в запросе, где он находится.
    mysql> 
    select CONSTRAINT_NAME 
    from KEY_COLUMN_USAGE 
    where CONSTRAINT_SCHEMA = '<Название базы данных>' 
     and TABLE_NAME = '<Название таблицы>' 
     and COLUMN_NAME = '<Название колонки с ключом>';
  3. Запоминаем его название.
  4. Открываем нужную базу данных (ту, в которой собираемся удалять внешний ключ).
    mysql>
    use `<Название базы данных>`;
  5. И удаляем его.
    mysql> 
    alter table `<Название таблицы>` 
    drop foreign key `<Ключ, который запомнили в пункте 3>`;

Предупреждение.

Пока мне не ясно, почему в описании таблицы, из которой удалялся ключ, все равно осталась пометка о том, что поле является ключом. Если кто-нибудь знает, напишите, пожалуйста, в комментарии.

+----------------+------------------------------+------+-----+---------+----------------+
| Field         | Type                         | Null | Key | Default | Extra          |
+----------------+------------------------------+------+-----+---------+----------------+
...
| field_with_key | int(10)                      | YES  | MUL | NULL    |                |
...
+----------------+------------------------------+------+-----+---------+----------------+

 

Пример.

Есть таблица классов.

+---------------+------------------------------+------+-----+---------+----------------+
| Field         | Type                         | Null | Key | Default | Extra          |
+---------------+------------------------------+------+-----+---------+----------------+
| id            | int(10)                      | NO   | PRI | NULL    | auto_increment |
| name          | varchar(100)                 | NO   |     | NULL    |                |
| learn         | tinyint(1) unsigned zerofill | NO   |     | NULL    |                |
| parent        | int(10)                      | YES  | MUL | NULL    |                |
| speciality_id | int(10)                      | NO   | MUL | NULL    |                |
| stream_id     | int(10)                      | NO   | MUL | NULL    |                |
+---------------+------------------------------+------+-----+---------+----------------+

Нужно удалить внешний ключ `parent`.

  1. Открываем системную базу данных information_schema.
  2. Ищем в ней нужный нам ключ.
    mysql> 
    select CONSTRAINT_NAME 
    from KEY_COLUMN_USAGE 
    where CONSTRAINT_SCHEMA = 'school_database' 
     and TABLE_NAME = 'class' 
     and COLUMN_NAME = 'parent';

    Получаем что-то вроде этого…

    +-----------------+
    | CONSTRAINT_NAME |
    +-----------------+
    | class_ibfk_1    |
    +-----------------+
  3. Запоминаем его название (`class_ibfk_1`).
  4. Открываем нужную базу данных (ту, в которой собираемся удалять внешний ключ).
    mysql>
    use `school_database`;
  5. И удаляем его.
    mysql> 
    alter table `class` 
    drop foreign key `class_ibfk_1`;
  6. Ключ удалён.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *