Поиск
Проблемы, связанные с определением таблиц
Проблемы с 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 новоеимя ;