OR
MySQL および MSSQL DBMS の単一のクエリで設定できる条件の最大数を知っている人はいますか?
2 に答える
コメントの情報から、サブクエリを使用してください。例えば:
delete tblCustomers
where CustomerId in (select CustomerId from tblOtherTable)
更新
状況を考えると、可能なアプローチは2つだけです。
- MSSQL からデータをエクスポートします。次に、そのデータを MySQL サーバーの一時テーブルにインポートします。インポート後、上記のようなクエリを実行します。
- 必要なすべての値を取得し、MySQL データベースに対して一連の INSERT/UPDATE クエリを実行する C# アプリを作成します。
最初のオプションは、非常にシンプルで高速に実行できるため、断然最適です。2 番目のオプションは、MSSQL サーバーのすべてのレコードに対して 2 つのクエリを実行することになるため、それほど優れていません。(レコードが存在するかどうかを調べるための 1 つと、その後に MySQL サーバーでの INSERT または UPDATE ステートメントのいずれかが続きます。
MySQLでは、SQL ステートメントに含めることができる条件の数は、変数の設定OR
によって制限される SQL ステートメントの最大長によって制限されます。max_allowed_packet
SHOW VARIABLE LIKE 'max_allowed_packet`
(注: の値max_allowed_packet
は文字ではなくバイト単位で指定されます。SQL ステートメントにマルチバイト文字が含まれている場合は注意が必要です)。
条件の大きなリストを含むステートメントの作成に直面した場合OR
、通常、同じ操作を実行する別の方法IN (list)
( またはJOIN
操作など) があります。
MySQL でのより効率的なアプローチは、テーブルを作成してファイルからロードすることです。(このアプローチの「大きな」難点は、文字セットのエンコーディングに互換性を持たせることです。)
latin1 エンコーディングまたは utf8 エンコーディングで SQL Server から .CSV ファイル (ID ごとに 1 行を削除) を生成できる場合、文字セットの一致は大きな問題というよりはスピード バンプになります。
MySQL 側:
CREATE TABLE ids_to_delete (id INT PRIMARY KEY);
LOAD DATA INFILE '/tmp/ids_to_delete.csv' INTO TABLE ids_to_delete
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
-- rows to be deleted (save a backup of this if you don't already have a mysqldump)
SELECT t.id
FROM my_target_table t
JOIN ids_to_delete d
ON d.id = t.id ;
-- perform the delete
-- DELETE t.*
-- FROM my_target_table t
-- JOIN ids_to_delete d
-- ON d.id = t.id ;
符号なし整数値 ( ^[0-9]*$
) の文字表現のみをロードする場合、変換に問題はないはずです。latin1 と utf8 の両方で、数字文字 '0' から '9' のエンコードは x'30' から x'39' であり、Windows スタイルの CR+LF は x'0d0a' です。