2016-04-19 15 views
1

私は以下のように構築されたSQLクエリがあります:私は、コードを実行すると、私は次のログを取得するNode.js Merge文のmysql構文エラー?

tmpQUERY = "INSERT INTO vertix_users (user_name, user_email, user_pass) " + 
    "VALUES (" + mysql.escape(userName) + 
    ", " + mysql.escape(userEmail) + 
    ", " + mysql.escape(userPass) + ")"; 

tmpQUERY = "MERGE vertix_users WITH (HOLDLOCK) AS oldData " + 
    "USING (VALUES (@user_name, @user_email)) AS newData (" + mysql.escape(userName) + ", " + mysql.escape(userEmail) + ") " + 
    "ON newData.user_name = oldData.user_name AND newData.user_email = oldData.user_email " + 
    "WHEN NOT MATCHED BY TARGET THEN " + tmpQUERY; 

を:

MERGE vertix_users WITH (HOLDLOCK) AS oldData USING (VALUES (@user_name, @user_email)) AS newData ('asfasfsaff vvv', 'asfasfasfasf') ON newData.user_name = oldData.user_name AND newData.user_email = oldData.user_email WHEN NOT MATCHED BY TARGET THEN INSERT INTO vertix_users (user_name, user_email, user_pass) VALUES ('asfasfsaff vvv', 'asfasfasfasf', 'saqqq') 

そして読み込むSQL構文エラー:

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 'MERGE vertix_users WITH (HOLDLOCK) AS oldData USING (VALUES (@user_name, @user_e' at line 1] 

マージのない簡単なinsert文は正常に動作しますが、そのコードの2番目の部分を追加するとエラーが発生します。

答えて

0

MERGEMySQLでサポートされていない、そのための同等の競合状態を引き起こす

INSERT ... ON DUPLICATE KEY UPDATE

+0

文句を言わないのですか?私がマージソリューションを使ったのは、それを避けるためです。 –

+1

それは単なるMySQLコマンド、別名アトミック操作なので、競合状態が発生するのではないかと疑います。 MySQLでMERGEを使用するオプションはありません。 –

+0

私は重複した鍵の更新を見ました。重複がない場合にのみ挿入を行う方法はわかりません。私は同じ名前のユーザーの挿入を防止しようとしています。 –