0

「userid」列と「expired」列を持つセッション テーブルがあります。指定されたユーザー ID があり、有効期限が切れていない行が存在するかどうかを確認し、行が見つからない場合は新しい行を挿入したいと考えています。

INSERT IGNORE について読みましたが、(ユーザー ID + 期限切れ) をキーにすることはできません。同じユーザー (すべて期限切れ) で複数の行を持つことができるため、期限切れになっていないユーザーを複数持つことはできません。

私はこれを試しましたが、役に立ちませんでした(「エラーがあります...」):

IF (SELECT 1 FROM sessions WHERE user = :user AND expired = 0) <> 1
INSERT INTO sessions (user) VALUES(:user)

('expired' はデフォルトで 0 です)。MySQL のバージョンは 5 です。

更新します。

私もこれを試しました:

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (user) VALUES(0)

HeidySQL 7を使用しています。どちらも機能しません。MySQL のバージョンは 5.5 です。

UPDATE2。ステートメントの論理エラーが修正されました。

よろしく、

4

4 に答える 4

1

Elvieejoの解決策は良いようですが、記載されている問題によって存在しないものを使用する必要があるように見えます。

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (user) VALUES(:user)
于 2012-08-03T16:39:58.310 に答える
0

私のステートメントの問題は、IF EXISTS がストアド プロシージャにあるはずだということです。それにもかかわらず、関数IF()は機能します。

SELECT IF(EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0), 0, 1)

今、私は 0 のような単純な値と INSERT INTO ステートメントを等しくする方法を探しています。これは機能しません:

SELECT IF(EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0), 0,
INSERT INTO sessions (user) VALUES (0) SELECT)

C++ の場合は、「?: オペランド間の型の不一致」と言って、コンマ演算子を使用します。SQLでは機能しません。

アップデート

さて、ストアド ルーチンを作成しました。それ以外は使えないのでIF。この mySQL はなんてばかげた RDBMS でしょう!

于 2012-08-03T18:58:23.157 に答える
0
INSERT IGNORE INTO sessions (user) VALUES(:user)
于 2012-08-03T19:15:15.537 に答える