web-dev-qa-db-ja.com

CREATE TABLE ... TYPE = MYISAMの1064エラー

ここに私のエラーがあります(さらに情報が必要な場合は尋ねてください)-エラー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は言った:

1064-SQL構文にエラーがあります。行6で 'TYPE = MyISAM'の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

CREATE TABLE構文


古いTYPEオプションはENGINEと同義でした。 TYPEはMySQL 4.0で廃止され、MySQL 5.5で削除されました。 MySQL 5.5以降にアップグレードする場合、TYPEに依存する既存のアプリケーションを変換して、代わりにENGINEを使用する必要があります。

したがって、以下が必要です。

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

SQLダンプファイルのCREATE TABLE .. TYPE=""構文に関する補足注記

TLDR:サードパーティ製ツールによって生成されたSQLダンプファイルにCREATE TABLE ... TYPE="..."ステートメントがまだある場合は、MYSQL40またはMYSQL323のデフォルトsqlmodeを使用するようにサーバーが構成されていることを最も確実に示します。

長編

他の人から言われたように、CREATE TABLETYPE引数はMySQLで長い間廃止されています。 mysqldumpは、ENGINE引数を正しく使用しますが、特に下位互換性のあるダンプを生成するように要求しない限り(たとえば、mysqldumpのバージョン5.7では--compatible=mysql40を使用します)。

ただし、多くの外部SQLダンプツール(たとえば、phpmyadmin、Navicat、DBVisualizerなどのMySQLクライアントに統合されたツール、iControlWPなどの外部自動バックアップサービスで使用されるツール)は、この変更を特に認識せず、代わりに依存していますSHOW CREATE TABLE ...コマンドを使用して、各テーブルにテーブル作成ステートメントを提供します(そして、明確にするために、これは実際には良いことです)。ただし、TYPE変数がSHOW CREATE TABLEまたはMYSQL40に設定されている場合、MYSQL323は実際にsqlmode引数を含む古い構文を生成します。

したがって、サードパーティ製ツールによって生成されたSQLダンプファイルでCREATE TABLE ... TYPE="..."ステートメントを引き続き取得する場合は、MYSQL40またはMYSQL323のデフォルトsqlmodeを使用するようにサーバーが構成されていることを最も確実に示します。

これらのsqlmodesは基本的に、いくつかの後方互換性のある動作を保持するようにMySQLを設定します。デフォルトでそれらを使用することは、数年前に主に推奨されました。ただし、これらのモードなしでは正しく動作しないコードがまだあることはほとんどありません。とにかく、MYSQL40MYSQL323、および他のいくつかの同様のsqlmodesは非推奨であり、MySQL 8.0以降ではサポートされていません。

サーバーがこれらのsqlmodesでまだ構成されており、これらを変更すると一部のレガシープログラムが失敗する可能性がある場合、すぐにSET SESSION sql_mode = 'MYSQL40';を実行して、そのプログラムにsqlmodeをローカルに設定することができます接続。これは一時的なパッチとしてのみ考慮されるべきであり、MySQL 8.0以降では機能しないことに注意してください。

SQLクエリの書き換えを伴わない、より将来性のあるソリューションは、有効にする必要がある互換性機能を正確に決定し、それらのみを有効にすることです(前述のとおり)。デフォルトのsqlmode(つまり、サーバーの構成)は、未設定のままにするのが理想的です(現在のバージョンでは公式のMySQLデフォルトが使用されます)。 sqlmode(MySQL 5.7現在)の完全なリストは、ここで説明されています: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

0
jwatkins