SQL
(デリミタの変更、ドロップ/作成テーブル、テーブルの変更などを含むドロップ/作成テーブルとストアドプロシージャ)のファイルがあります。私は次のようにこのファイルを実行しよう:PHPでファイルから複雑なSQLを実行するmysqli
$sql = file_get_contents("sql/filename.sql");
if (!$mysqli->multi_query($sql)) {
echo("Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error);
exit();
}
do {
if ($res = $mysqli->store_result()) {
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
いくつかのファイルが正常に処理されますが、区切り文字の変更と他のファイルとストアドプロシージャの作成に私がエラー受信:私はこれの内容をコピーする場合
Multi query failed: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$
DROP PROCEDURE IF EXISTS alter_members_table $$
CREATE PROCEDUR' at line 1
をSQL
ファイルを開き、phpMyAdmin
で実行してください。すべて正常に動作しますので、SQL
が正しいと確信しています。
何が問題なのですが、これをどのように修正できますか?
UPDATE ... SQL
ファイルの 一つは、このエラーを生成:
DELIMITER $$
DROP PROCEDURE IF EXISTS procedure_name $$
CREATE PROCEDURE procedure_name()
BEGIN
IF NOT EXISTS ((
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND COLUMN_NAME = 'column_name'
AND TABLE_NAME = 'table_name'
))
THEN
ALTER TABLE `table_name`
ADD COLUMN `column_name` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
AFTER `other_column_name`;
END IF;
END $$
CALL procedure_name() $$
DELIMITER ;
私はここにストアドプロシージャを使用する理由、これはプラグインのインストールスクリプトの一部であり、それは準備するために、いくつかのSQLファイルを実行する必要がありますDB。私は解決策のためにサーフィンしましたが、それでもまだ存在しない場合にのみ新しい列を作成する方法はあります。私は手順上の解決策しか見つけられませんでした。
http://stackoverflow.com/questions/345637/php-multiple-sql-queries-in-one-mysql-query-statement/345712#345712 –
私はあなたに私たちに失敗したクエリの例実際のコードではなく、同じコードスタイルと構文を外しても – RiggsFolly
また、multi_queryで多数のクエリを実行する場合は、それぞれが一意のクエリとして実行されます。そのため、おそらくDROP PROCEDURE IF EXISTS alter_members_table; ' – RiggsFolly