1

基準が満たされているかどうかを確認し、回答に応じて a)INSERTまたは b)のいずれかを確認するクエリを 1 つ持つことは可能UPDATEですか?

(マンダーの回答で提案されたより良い例)

CASE 
   WHEN
      IF EXISTS (SELECT action FROM database where action = 'eat' AND user = 'me') 
      THEN  (UPDATE database set action = 'digest' where user = 'me')
   WHEN
      IF EXISTS (SELECT action FROM database where action = 'inhale' AND user = 'me') 
      THEN  (UPDATE database set action = 'exhale' where user = 'me')

   ELSE (INSERT INTO database (user,action) VALUES ('me','living'))
END CASE

期待どおりの結果が得られません。

4

3 に答える 3

2

IF EXISTS を使用

IF EXISTS (SELECT action FROM database where action = 'eat' AND user = 'me') 
 THEN  (UPDATE database set action = 'digest' where user = 'me')

ELSE (INSERT INTO database (user,action) VALUES ('me','eat'))
于 2012-09-10T01:07:39.110 に答える
1

(action, user)がテーブル内の一意のキーである場合、構文INSERT ... ON DUPLICATE KEY UPDATEを使用してこれを実現できます。

INSERT INTO database (user,action) VALUES ('me','eat')
ON DUPLICATE KEY UPDATE Action='digest';
于 2012-09-10T01:14:20.217 に答える
0

あなたが望むものには多くの可能な解決策があります。そのためのストアド プロシージャを作成することをお勧めします。例

DELIMITER $$
CREATE PROCEDURE InsertOrUpdate
BEGIN
    DECLARE `result` int;
    SET `result` := (   
                        SELECT COUNT(*) 
                        FROM database
                        WHERE action = 'eat' AND
                             `user` = 'me'
                    );
    IF  `result` > 0 THEN
        UPDATE database 
        SET action = 'digest' 
        WHERE user = 'me';
    ELSE
        INSERT INTO database (user,action) 
        VALUES ('me','eat');
    END IF;
END $$
DELIMITER ;

使用法、

call InsertOrUpdate();
于 2012-09-10T01:30:30.570 に答える