2017-06-03 14 views
0

私はこのクエリを書きましたが、私は次のエラーを取得:私はそれは自明ですが、私の目標は、レコードが存在し、そうでない場合は、それを挿入するかどうかを確認することだと思いなぜこのSQLクエリが機能しないのですか?

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BEGIN INSERT INTO forum_topics_track (userid , topic_id , `c' at line 3

を。

IF NOT EXISTS 
       (SELECT * FROM `forum_topics_track` WHERE `userid` = '{$userid}' AND `topic_id` = '{$topic_id}') 
      BEGIN 
       INSERT INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
       VALUES ('{$topic_id}', '{$category_id}', '{$userid}') 
      END; 
+1

最初に何かを確認する必要はありません。実際、それは完全に逆効果です! – Strawberry

答えて

1

速い代わりはuseridtopic_idにUNIQUE INDEXを持っているだろう。

CREATE UNIQUE INDEX forum_topics_track_ndx ON forum_topics_track(userid, topic_id); 

次に、あなたは常に(データがすでに存在する場合、おそらく何もしない)成功する

INSERT IGNORE INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
      VALUES ('{$topic_id}', '{$category_id}', '{$userid}'); 

を行うことができます。

またはON DUPLICATE KEY UPDATEのトリックを調べることができます。

+0

これは私が試した最初のもので、うまくいきました。ありがとうございました、そして私の質問に答えた残りの人に感謝します。 – user3628807

1

ロジックを実装するには間違った方法です。各ユーザーとトピックをforum_topics_trackに一度表示する場合は、データベースに制約を適用させます。これは、一意のインデックスまたは制約と簡単です。そして、

create unique index unq_forum_topics_track_user_topic on forum_topics_track(user_id, topic_id); 

、あなたが挿入を行うことができますし、エラーを無視するか、ハンドル:

INSERT INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
    VALUES ('{$topic_id}', '{$category_id}', '{$userid}') 
    ON DUPLICATE KEY UPDATE userid = VALUES(userid); 

を何IFがロジックに必要ありません。実際にIFを使用すると、競合状態によって問題が発生するだけで、データベースには何も保証されません。

0

IF NOT EXISTSは、MS-SQLでは使用できますが、MySQLでは使用できない句です。次のクエリを試してください。

INSERT INTO `forum_topics_track` (`userid`, `topic_id`, `category_id`) 
SELECT '{$topic_id}', '{$category_id}', '{$userid}' 
WHERE NOT EXISTS(
    SELECT * FROM `forum_topics_track` WHERE `userid` = '{$userid}' AND `topic_id` = '{$topic_id}' 
) 
+0

FROM句なしでWHERE句を使用することはできません。しかし、それをFROM句のサブクエリで修正できます。 –

+0

こんにちはポール、私はこのクエリをテストし、それは正常に動作しています。 FROM句は、クエリの次の部分を実行しようとする場合にのみ必要です。 SELECT '{$ topic_id}'、 '{$ category_id}'、 '{$ userid}' WHERE'userid' = '{$ userid}'と 'topic_id' = '{$ topic_id}' ) –

+0

私はhttp://rextester.com(これはMySQL 5.7を実行しています)でテストしました。しかし、私のローカルMariaDB 10.0.19では動作しません。私はそれがMySQL 5.6では動作しないと確信していますが、テストするためのインストールはまだありません。 [documentation](https://dev.mysql.com/doc/refman/5.7/en/select.html)を見てみると、 'FROM'なしで' WHERE'が実行できないことがわかります: "* * [** FROM table_references [PARTITION partition_list] [WHERE where_condition] ... **] ** "。それはMySQL 5.7でも動作しますが、この動作は文書化されていません。 –

関連する問題