Поиск

Проблемы, связанные с определением таблиц

Проблемы с ALTER TABLE

Оператор ALTER TABLE изменяет таблицу на текущий набор символов. Если во время выполнения alter TABLE появляется ошибка дублирования ключей, причина будет за­ ключаться либо в том, что новый набор символов преобразует ключи в одинаковые зна­ чения, либо в том, что таблица повреждена. В последнем случае для таблицы потребует­ ся ВЫПОЛНИТЬ REPAIR TABLE .

Если при использовании ALTER TABLE появляется ошибка, указанная ниже, проблема скорее всего связана с тем, что работа MySQL была аварийно прекращена во время бо­ лее ранней операции ALTER table и где-то рядом осталась старая таблица с именем А-ххх или В-ххх:

Error on rename of '. / имя_базы_данныхI имя. f rm ' to './имя_базы_данных/В-ххх. frm 1 ( Errcode : 17)

В таком случае откройте каталог данных MySQL и удалите все файлы, имена кото­ рых начинаются с А- или В-. (Вместо удаления их можно и просто переместить в другой каталог.)

ALTER TABLE работает следующими образом:

  • Создается новая таблица с именем А-ххх с заданными структурными изменениями.
  • Все строки из исходной таблицы копируются в таблицу А-ххх. Исходная таблица переименовывается на В-ххх.

ш Таблице А-ххх присваивается имя исходной таблицы.

■ Таблица В-ххх удаляется.

Если во время операции по переименованию что-нибудь пойдет не так, MySQL по­ пытается отменить изменения. Если случится нечто действительно серьезное (чего ко­нечно произойти не должно), MySQL может оставить старую таблицу с именем В-ххх. Простое переименование файлов таблиц на уровне системы позволит вернуть ваши дан­ные обратно.

При применении ALTER TABLE на транзакционной таблице или если используется операционная система Windows или OS/2, ALTER TABLE разблокирует таблицу через UNLOCK в том случае, когда таблица была заблокирована с помощью LOCK TABLE . Причи­ на этого состоит в том, что InnoDB и упомянутые операционные системы не могут уда­ лять таблицы, находящиеся в использовании.

Изменение порядка столбцов в таблице

Прежде всего, потребуется определиться с тем, действительно ли необходимо изме­ нять порядок столбцов в таблице. Весь смысл SQL заключается в том, чтобы отделить приложение от формата хранения данных. Следует всегда указывать порядок извлечения данных. Первый из представленных ниже операторов возвращает столбцы в порядке имя_столбца1, имя_столбца2, имя_столбцаЗ, в то время как второй возвращает их в порядке имя_столбца1, имя_ столбца З, имя_столбца2:

raysql > SELECT имя_столбца 1, имя_столбца2, имя_столбцаЗ FROM имя_таблицы; mysql > SELECT имя_столбца1, имя_столбцаЗ, имя_столбца2 FROM имя_таблицы;

Если принято решение изменить порядок столбцов таблицы в любом случае, сделать это можно следующим образом:

  • Создайте новую таблицу, столбцы в которой размещены в требуемом порядке.
  • Выполните такой оператор:

mysql> INSERT INTO новая_таблица

-> SELECT столбцы-в-новом-порядке FROM старая_таблица;

3. Удалите или переименуйте старая_ таблица.

4. Присвойте новой таблице имя старой таблицы:

mysql > ALTER TABLE новая__таблица RENAME старая_таблица;

SELECT * вполне подходит для тестирования запросов. Однако, в приложении нико­гда нельзя полагаться на использование SELECT * и извлекать столбцы, основываясь на их позициях. Позиция и порядок, в котором возвращаются столбцы, не остаются преж­ними, если столбцы добавляются, перемещаются или удаляются. Простое изменение в структуре таблицы может привести к сбою в работе приложения.

Проблемы с TEMPORARY TABLE

В следующем списке перечислены ограничения по использованию временных ( TEMPORARY ) таблиц:

  • Временной ( TEMPORARY ) таблицей может быть только таблица типа HEAP , ISAM , MylSAM , MERGE ИЛИ InnoDB .
  • В одном и том же запросе нельзя ссылаться на таблицу TEMPORARY более одного раза. Например, следующий запрос не работает:

mysql> SELECT * ШЖ temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table f

  • Оператор SHOW TABLES временные таблицы не показывает.
  • Нельзя использовать RENAME для переименования таблицы temporary . Вместо этого можно применять ALTER TABLE:

mysql> ALTER TABLE исходноеимя RENAME новоеимя ;