bashツールを使用してSQLファイルからフルテキストを削除するにはどうすればよいですか?
myisam テーブルを複製して INNODB に変換する必要があるため、使用できません
DROP FULLTEXT INDEX ON table_name
私が試したこと
sed -i 's@FULLTEXT.*.)@@g' post.sql
私は PHP スニペットを使用してこれを自動化していますが、perl や sed でも同様の方法でこれを実行できると確信しています。何も失われないように、全文索引を C スタイルのコメントで囲みます。
php -r 'file_put_contents("schema.sql", preg_replace("/(,\s+FULLTEXT KEY [^)]+\))/", "/*$1*/", file_get_contents("schema.sql")));'
これは、MySQL スキーマ ファイル (CREATE TABLE) に対して機能します。
Bill Karwin が指摘したように、正規表現に一致する可能性のあるデータを含む完全な SQL ダンプに対してこれを実行すると、そのデータが変更されます。
これは、少なくとも 3 つの理由で自動化するのが難しいです。
CREATE TABLE `foo` (
`c` TEXT,
FULLTEXT KEY `c` (`c`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
FULLTEXT KEY 行を削除するには、前の行の末尾にあるカンマも削除する必要があります。または、FULLTEXT KEY 行を他の行に置き換えます。
文字列 "FULLTEXT KEY" は、SQL スクリプトの別の場所 (文字列リテラル内またはコメント内) に出現する可能性があります。そのため、偽陽性の一致に注意する必要があります。
単純に「FULLTEXT KEY」を「KEY」に変更することもできますが、フルテキスト インデックスが長い VARCHAR または TEXT 列で宣言されることはかなり一般的であり、従来のインデックスの 1000 バイト制限には長すぎます。インデックス プレフィックスを使用することもできますが、プレフィックスの長さを選択し、正規表現で複数列のインデックスを処理するのは困難です。
この問題は、SQL スクリプトを作成する前にすべての FULLTEXT インデックスを削除することで解決できます。すべての FULLTEXT インデックスに対してクエリを実行し、情報スキーマからドロップ ステートメントを生成できます。
例えば:
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` DROP KEY `',
index_name, '`;') AS ddl
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='test' and index_type='FULLTEXT';
私の 2 番目の選択肢は、元のデータベースを変更できず、スクリプトを変更する必要がある場合、SQL スクリプトを自動化するのではなく、テキスト エディターで手動で編集することです。これにより、各ケースを検査し、適切な方法で編集する機会が得られます。
SQL スクリプトが非常に大きなファイルである場合は、テキスト エディターを慎重に選択する必要があります。