Механизм хранения таблиц для <TABLE> не имеет этой опции для заказа по запросу (ОШИБКА 1031)

80

Механизм хранения таблиц для <TABLE> не имеет этой опции.

Это ошибка, возвращаемая MySQL по order byзапросу. Тип столбца - varchar(2000).

Запрос:

select * from `dbo.table_1` order by textT;

Возвращена ошибка:

ОШИБКА 1031 (HY000): механизм хранения таблиц для 'dbo.table_1' не имеет этой опции.

Почему так происходит? И как это исправить?

Умайр Икбал
источник
используйте отдельные обратные кавычки как для имени базы данных, так dboи для имени таблицыtable_1
Рэвиндер Редди
заявление должно выглядеть такselect * from `dbo`.`table_1` order by textT
Рэвиндер Редди
Может быть проблемаmax_length_for_sort_data
Абхик Чакраборти,
Проверьте это: dev.mysql.com/doc/refman/5.0/en/example-storage-engine.html
Станисловас Калашниковас
2
Вы упустили три важных элемента информации, и никто из комментаторов их не запрашивал. - Какая версия MySQL? Какой ДВИГАТЕЛЬ для хранения? Обеспечьте SHOW CREATE TABLE table_1.
Рик Джеймс

Ответы:

172

Эта проблема возникает, когда вы импортируете определение таблицы, которое было создано с помощью MyISAM, но позже было переключено на InnoDB; полученные ROW_FORMATпараметры кажутся недопустимыми.

Если вы пытаетесь импортировать экспортированную базу данных и сталкиваетесь с этой проблемой, вы можете просто выполнить поиск и ROW_FORMAT=FIXEDничего не заменить .

Чтобы сделать это очень быстро, я использовал следующее:

sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql

Задача решена! Спасибо jbrahy за указание на то, что проблема была в ROW_FORMAT.

РЕДАКТИРОВАТЬ: обновлено для работы на других платформах в соответствии с предложением @ seven

Джаагсма
источник
Это сработало для меня, мне заблокировали импорт из файла дампа, и теперь он импортирует.
Blackwood
хороший халтурщик! спас меня
Тим Кречмер
2
@haagsma предлагает отредактировать "-ie" вместо просто sed -e. -ie работает как с GNU, так и с BSD версиями sed. Я os osx и -i работает по-другому)sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql
7
3
Если @jbrahy указал на проблему, не следует ли ему наградить ответ? Кажется странным, что у него 4 очка, а у вас 32, когда его ответ был правильным.
Johnny 3653925
1
Согласно этому отчету об ошибке , в MySQL 5.6 и FIXEDболее ранних версиях он автоматически меняется на COMPACT. Похоже, это предполагает, что sed -ie 's/ROW_FORMAT=FIXED/ROW_FORMAT=COMPACT/g' backup.sqlэто было бы «более безопасным» решением с точки зрения сохранения того же поведения.
Steen Schütt
11

Я получаю ту же ошибку, когда импортирую определение таблицы InnoDB с ROW_FORMAT = DYNAMIC в нем. Таблица была создана с помощью движка MyISAM, но позже я переключил ее на InnoDB. Когда я удалил ROW_FORMAT = DYNAMIC из оператора create table и воссоздал таблицу, все заработало. Моим решением вашей проблемы было бы следующее.

show create table `dbo.table_1`;

затем возьмите вывод этой команды и удалите ROW_FORMAT = DYNAMIC, затем переименуйте таблицу в dbo.table_1_old

rename table `dbo.table_1` to `dbo.table_1_old`;

Затем выполните оператор создания таблицы с первого шага, т.е.

-- don't use this create as there are missing columns use yours
create table `dbo.table_1` (textT VARCHAR(255)); 

Затем заново заполните таблицу старыми данными.

insert into `dbo.table_1` select * from `dbo.table_1_old`;

Тогда вы сможете выполнить свой исходный SQL

select * from `dbo.table_1` order by textT;
Jbrahy
источник
10

Вы также можете попробовать это:

ALTER TABLE `dbo.table_1` ROW_FORMAT = DEFAULT ;
Микеле Манзато
источник
Спасибо, это отлично сработало для меня и избавило меня от необходимости перестраивать innodb несколько таблиц, заполненных внешними ключами.
Ян
2

Эта проблема возникает, когда вы импортируете определение таблицы в MySQL 5.7, которая была создана с MySQL 5.6 и ранее. Та же ошибка может быть вызвана параметром KEY_BUFFER_SIZE = 8192 и аналогичными размерами, определенными в байтах для INNODB ENGINE. У меня была эта ошибка при импорте базы из sql-dump. Решение: sed -ie 's / KEY_BLOCK_SIZE = 16384 // g' my-file-sql_dump.sql

ANF-67
источник
1

Я столкнулся с этой проблемой, и мой файл резервной копии был зашифрованным .zsql. Поэтому я изменил my.cnf, добавив innodb_strict_mode = off. Все работало нормально

prgmrDev
источник