2

ユーザー変数に設定されたテーブル名内で LOAD DATA INFILE を実行できますか?

動作しないスクリプトは次のとおりです。

INSERT INTO Demand (name, comment, scale) VALUES (A,A,1); 
SET @Demand_id = LAST_INSERT_ID(); 

 INSERT INTO Matrices (name, comment, total) VALUES (Matrix_0_1); 
 SET @Matrices_last_id = LAST_INSERT_ID(); 
     INSERT INTO DemandSegment (usertype, Matrix, scale) SELECT 1, id, 2 FROM Matrices WHERE id = @matrice_last_id; 
     SET @DemandSegment_last_id = LAST_INSERT_ID(); 
     INSERT INTO Demand_DemandSegment (Demand_id, DemandSegment_id) VALUES(@Demand_id, @DemandSegment_last_id); 

     SET @matrix_creation = CONCAT("CREATE TABLE Matrix_",@matrices_last_id," LIKE Matrix_2");
     PREPARE stmt from @matrix_creation;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;

     SET @matrix_insertion = CONCAT("LOAD DATA INFILE '0.csv' INTO TABLE Matrix_",@Matrices_last_id);
     PREPARE stmt from @matrix_insertion;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;

これが私が得るエラーです:

ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet

ERROR 1243 (HY000): Unknown prepared statement handler (stmt) given to EXECUTE

ERROR 1243 (HY000): Unknown prepared statement handler (stmt) given to DEALLOCATE PREPARE

私が読むことができるように、そうすることが不可能である場合、代替手段はありますか?

4

1 に答える 1

-1

1 つの代替方法は、DATA を一時テーブルにロードしてから、一時テーブルを実際のテーブルにコピーすることです。

CREATE TEMPORARY TABLE Matrix_temp LIKE Matrix_2;
LOAD DATA INFILE '0.csv' INTO TABLE Matrix_temp; -- not a prepared statement

SET @matrix_creation = CONCAT('CREATE TABLE Matrix_',@matrices_last_id,
 ' LIKE Matrix_2');
PREPARE stmt from @matrix_creation;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @matrix_insertion = CONCAT('INSERT INTO Matrix_',@Matrices_last_id, 
 ' SELECT * FROM Matrix_temp');
PREPARE stmt from @matrix_insertion;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

レプリケーションも使用する場合は、この方法で一時テーブルを使用するリスクに注意してください。スレーブが再起動すると、一時テーブルは失われます。一時テーブルにデータを入力してから永続テーブルにコピーするまでの間にこれが発生すると、レプリケーションが中断される可能性があります。

そのようなことは決して起こらないように聞こえますが、これはかなり一般的です。http://dev.mysql.com/doc/refman/5.6/en/replication-features-temptables.html
を参照してください。

于 2013-05-15T20:28:38.550 に答える