web-dev-qa-db-fra.com

Le moteur de stockage de table pour <TABLE> n'a pas cette option commande par requête (ERROR 1031)

Le moteur de stockage de table pour <TABLE> n'a pas cette option.

C'est l'erreur renvoyée par MySQL sur une requête order by. Le type de colonne est varchar(2000).

Requete:

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

Erreur renvoyée:

ERREUR 1031 (HY000): le moteur de stockage de la table pour 'dbo.table_1' n'a pas cette option.

Pourquoi cela arrive-t-il? Et comment puis-je résoudre ce problème?

74
Umair Iqbal

Ce problème semble se produire lorsque vous importez une définition de table créée avec MyISAM mais passée ultérieurement à InnoDB. les options ROW_FORMAT résultantes semblent non valides.

Si vous essayez d'importer une base de données exportée et rencontrez ce problème, vous pouvez simplement rechercher et remplacer ROW_FORMAT=FIXED Par rien.

J'ai utilisé ce qui suit pour le faire très rapidement:

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

Problème résolu! Merci à jbrahy d’avoir fait remarquer que c’était le problème ROW_FORMAT.

EDIT: mis à jour pour fonctionner pour plus de plates-formes selon la suggestion de @ seven

153
jhaagsma

La même erreur se produit lorsque j'importe une définition de table qui est InnoDB avec ROW_FORMAT = DYNAMIC. La table a été créée avec un moteur MyISAM, mais je l’ai ensuite basculée sur InnoDB. Lorsque j'ai supprimé ROW_FORMAT = DYNAMIC de l'instruction create table et que j'ai recréé la table, cela a bien fonctionné. Ma solution à votre problème serait la suivante.

show create table `dbo.table_1`;

puis prenez le résultat de cette commande et supprimez le ROW_FORMAT = DYNAMIC puis renommez la table en dbo.table_1_old

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

Exécutez ensuite l’instruction create table à partir de la première étape, c.-à-d.

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

Puis repeupler votre table avec les anciennes données.

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

Ensuite, vous devriez pouvoir exécuter votre code SQL original

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

Vous pouvez aussi essayer ceci:

ALTER TABLE `dbo.table_1` ROW_FORMAT = DEFAULT ;
6
Michele Manzato

Ce problème semble se produire lorsque vous importez une définition de table dans MySQL 5.7 créée avec MySQL 5.6 et versions antérieures. La même erreur peut produire par l’option KEY_BUFFER_SIZE = 8192 et des tailles similaires définies en octets pour INNODB ENGINE. J'ai eu cette erreur lorsque j'importe la base de sql-dump. Décision: sed -ie '/ KEY_BLOCK_SIZE = 16384 // g' mon-fichier-sql_dump.sql

2
ANF-67

Je faisais face à ce problème et mon fichier de sauvegarde était crypté .zsql fichier. J'ai donc modifié my.cnf en ajoutant innodb_strict_mode = off. Ça a bien fonctionné

1
prgmrDev