1

bashツールを使用してSQLファイルからフルテキストを削除するにはどうすればよいですか?

myisam テーブルを複製して INNODB に変換する必要があるため、使用できません

DROP FULLTEXT INDEX ON table_name

私が試したこと

sed -i 's@FULLTEXT.*.)@@g' post.sql
4

2 に答える 2

1

私は 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 ダンプに対してこれを実行すると、そのデータが変更されます。

于 2014-08-07T20:17:05.523 に答える
1

これは、少なくとも 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 スクリプトが非常に大きなファイルである場合は、テキスト エディターを慎重に選択する必要があります。

于 2012-12-25T18:02:05.923 に答える