web-dev-qa-db-ja.com

MySQLでテーブルをInnoDBからARCHIVEに変更する

SQLコマンドを使用して、テーブルをInnoDBからARCHIVEに変更してみます。

ALTER TABLE data_obook ENGINE = ARCHIVE;

ただし、常にエラーのみが表示されます。

#1005 - Can't create table 'coincity.#sql-1350_8a' (errno: -1) 

私の構造:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `data_obook` (
  `market_id` int(6) NOT NULL,
  `curr_id` int(4) NOT NULL,
  `book_id` bigint(20) NOT NULL,
  `type` varchar(5) NOT NULL,
  `price` float NOT NULL,
  `amount` double NOT NULL,
  `stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`market_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

誰かが解決策を手伝ってくれる?ありがとうございました。

3
Maximi

ARCHIVE Storage Engine はいかなる種類のインデックスもサポートしないため、主な問題は_PRIMARY KEY_の存在です。 _PRIMARY KEY_をドロップするだけです。次に、ストレージエンジンを変換します。

これには2つのアプローチがあります

アプローチ#1

_ALTER TABLE date_obook DROP PRIMARY KEY;
ALTER TABLE date_obook ENGINE=ARCHIVE;
_

アプローチ#2

_CREATE TABLE date_obook_new LIKE date_obook;
ALTER TABLE date_obook_new DROP PRIMARY KEY;
ALTER TABLE date_obook_new ENGINE=ARCHIVE;
INSERT INTO date_obook_new SELECT * FROM date_obook;
ALTER TABLE date_obook RENAME date_obook_old;
ALTER TABLE date_obook_new RENAME date_obook;
DROP TABLE date_obook_old;
_

試してみる !!!

特記事項

_PRIMARY KEY_属性を持つ_AUTO_INCREMENT_を誰かが持っている場合は、最初に_AUTO_INCREMENT_属性を削除する必要があります。次に、_PRIMARY KEY_を削除してから、ストレージエンジンを変換します。たとえば、_market_id_がint(6) NOT NULL AUTO_INCREMENTとして定義されている場合は、次のようにします。

_ALTER TABLE date_obook MODIFY market_id INT NOT NULL;
ALTER TABLE date_obook DROP PRIMARY KEY;
ALTER TABLE date_obook ENGINE=ARCHIVE;
_
2
RolandoMySQLDBA

ARCHIVEエンジンは自動インクリメントカラムを持つことができ、そのためにはインデックスが必要です。

ドキュメント( 5.55.65.7 )に従って:

ARCHIVEエンジンはAUTO_INCREMENT列属性をサポートしています。 AUTO_INCREMENT列には、一意のインデックスまたは一意でないインデックスのいずれかを含めることができます。他の列にインデックスを作成しようとすると、エラーが発生します。 ARCHIVEエンジンは、CREATE TABLEステートメントのAUTO_INCREMENTテーブルオプションもサポートし、新しいテーブルの初期シーケンス値を指定したり、既存のテーブルのシーケンス値をリセットしたりします。

_ALTER TABLE my_table AUTO_INCREMENT=0, ENGINE=ARCHIVE;
_

_AUTO_INCREMENT_をリセットしないと、ERROR 1022 (23000): Can't write; duplicate key in tableで失敗します

_PRIMARY KEY_が自動インクリメントでないときにこれを実行しようとすると、次のようになります。

_mysql [localhost] {root} (test) > create table foo (id int primary key);
Query OK, 0 rows affected (0.09 sec)

mysql [localhost] {root} (test) > alter table foo engine=archive;
ERROR 1030 (HY000): Got error -1 from storage engine
_
1
Cez