web-dev-qa-db-fra.com

Erreur 1064 dans CREATE TABLE ... TYPE = MYISAM

Voici mon erreur (si vous avez besoin de plus d'informations, il suffit de demander) - Erreur Requête SQL:

CREATE TABLE dave_bannedwords(

id INT( 11 ) NOT NULL AUTO_INCREMENT ,
Word VARCHAR( 60 ) NOT NULL DEFAULT  '',
PRIMARY KEY ( id ) ,
KEY id( id )
) TYPE = MYISAM ;

MySQL a déclaré: 

1064 - Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de 'TYPE = MyISAM' à la ligne 6

Comme indiqué dans CREATE TABLE Syntaxe :

Remarque
L'ancienne option TYPE était synonyme de ENGINE. TYPE est obsolète dans MySQL 4.0 et supprimé dans MySQL 5.5. Lors de la mise à niveau vers MySQL 5.5 ou une version ultérieure, vous devez convertir les applications existantes qui dépendent de TYPE pour utiliser ENGINE à la place.

Par conséquent, vous voulez:

CREATE TABLE dave_bannedwords(
  id   INT(11)     NOT NULL AUTO_INCREMENT,
  Word VARCHAR(60) NOT NULL DEFAULT '',
  PRIMARY KEY (id),
  KEY id(id) -- this is superfluous in the presence of your PK, ergo unnecessary
) ENGINE = MyISAM ;
71
eggyal

Une note complémentaire sur la syntaxe CREATE TABLE .. TYPE="" dans les fichiers de vidage SQL

TLDR: Si vous obtenez toujours des instructions CREATE TABLE ... TYPE="..." dans des fichiers de vidage SQL générés par des outils tiers, cela indique très certainement que votre serveur est configuré pour utiliser une valeur par défaut sqlmode de MYSQL40 ou MYSQL323.

Longue histoire

Comme d'autres l'ont déjà dit, l'argument TYPE de CREATE TABLE est obsolète depuis longtemps dans MySQL. mysqldump utilise correctement l'argument ENGINE, à moins que vous ne lui demandiez spécifiquement de générer un cliché compatible avec les versions antérieures (par exemple, en utilisant --compatible=mysql40 dans les versions de mysqldump jusqu'à 5.7).

Cependant, de nombreux outils de vidage SQL externes (par exemple, ceux intégrés aux clients MySQL tels que phpmyadmin, Navicat et DBVisualizer, ainsi que ceux utilisés par des services de sauvegarde automatisés externes tels que iControlWP) ne sont pas spécifiquement informés de cette modification, et se basent plutôt sur la commande SHOW CREATE TABLE ... pour fournir des instructions de création de table pour chaque table (et le préciser: c'est en fait une bonne chose). Toutefois, le SHOW CREATE TABLE générera une syntaxe obsolète, y compris l'argument TYPE, si la variable sqlmode est définie sur MYSQL40 ou MYSQL323.

Par conséquent, si vous obtenez toujours des instructions CREATE TABLE ... TYPE="..." dans des fichiers de vidage SQL générés par des outils tiers, cela indique très certainement que votre serveur est configuré pour utiliser une valeur par défaut sqlmode de MYSQL40 ou MYSQL323.

Ces sqlmodes configurent essentiellement MySQL pour conserver certains comportements rétrocompatibles, et leur utilisation par défaut a été largement recommandée il y a quelques années. Il est cependant hautement improbable que vous ayez encore du code qui ne fonctionnerait pas correctement sans ces modes. Quoi qu'il en soit, MYSQL40, MYSQL323 et plusieurs autres sqlmodes similaires sont eux-mêmes obsolètes et ne sont pas supportés dans MySQL 8.0 ou version ultérieure.

Si votre serveur est toujours configuré avec ces sqlmode et que vous craignez qu'un programme existant échoue si vous les modifiez, il est alors possible de définir le sqlmode en local pour ce programme, en exécutant SET SESSION sql_mode = 'MYSQL40'; immédiatement après la connexion. Notez que cela ne devrait être considéré que comme un correctif temporaire et ne fonctionnera pas dans MySQL 8.0 et supérieur.

Une solution plus pérenne n'impliquant pas de réécriture de vos requêtes SQL consisterait à déterminer exactement quelles fonctionnalités de compatibilité doivent être activées et à ne les activer que programme par programme (comme décrit précédemment). La valeur par défaut sqlmode (c'est-à-dire dans la configuration du serveur) devrait idéalement être laissée non définie (qui utilisera les valeurs par défaut officielles de MySQL pour votre version actuelle). La liste complète de sqlmode (à partir de MySQL 5.7) est décrite ici: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html .

0
jwatkins