0

В игре для 2-х игроков, я пытаюсь, чтобы пропустить поворот игрока, вызвав следующую хранимую функцию:Update 1 из 2-х колонок - в зависимости от состояния

CREATE OR REPLACE FUNCTION skip_game(
     IN in_uid integer, -- player id 
     IN in_gid integer) -- game id 
     RETURNS void AS 
$func$ 
BEGIN 
     UPDATE games 
     SET stamp1 = extract('epoch' from current_timestamp) 
     WHERE gid = in_gid 
     AND player1 = in_uid 
     AND stamp1 < stamp2; -- it is player1's turn 

     IF NOT FOUND THEN 
       UPDATE games 
       SET stamp2 = extract('epoch' from current_timestamp) 
       WHERE gid = in_gid 
       AND player2 = in_uid 
       AND stamp2 < stamp1; -- it is player2's turn 
     END IF; 

END 
$func$ LANGUAGE plpgsql; 

ли, пожалуйста, можно объединить два выше UPDATE-операторов до одного - и установить либо stamp1, либо stamp2 в текущую эпоху, в зависимости от состояния?

Кроме того, я не понимаю, почему PostgreSQL 9.5 всегда сообщает обновляемый 1 row - событие, если я вызываю эту функцию с недопустимыми аргументами?

# select skip_game(1, 1); 
skip_game 
----------------- 

(1 row) 

# select skip_game(95, 95); 
skip_game 
----------------- 

(1 row) 

Вот games таблицы (я использую эпохи целые числа для stamp колонн для облегчения связи с мобильным приложением на стороне клиента - которая использует SQLite):

CREATE TABLE games (
     gid SERIAL PRIMARY KEY, 
     created TIMESTAMP NOT NULL, 

     player1 INTEGER REFERENCES users(uid) ON DELETE CASCADE NOT NULL, 
     player2 INTEGER REFERENCES users(uid) ON DELETE CASCADE, 

     stamp1 INTEGER, -- timestamp of the last turn 
     stamp2 INTEGER, -- timestamp of the last turn 

     letters1 VARCHAR(7) NOT NULL, 
     letters2 VARCHAR(7) NOT NULL, 
     letters VARCHAR(116) NOT NULL, 

     board VARCHAR(225) NOT NULL, 
     style INTEGER NOT NULL CHECK (1 <= style AND style <= 4) 
); 

ответ

1

Использование одного UPDATE:

UPDATE games 
SET stamp1 = CASE WHEN stamp1 < stamp2 THEN extract('epoch' from current_timestamp) 
        ELSE stamp1 END 
    ,stamp2 = CASE WHEN stamp2 < stamp1 THEN extract('epoch' from current_timestamp) 
        ELSE stamp2 END 
WHERE gid = in_gid AND (player1 = in_uid OR player2 = in_uid); 
1

Добавить условие в запросе:

UPDATE games 
SET stamp1 = CASE WHEN stamp1 < stamp2 THEN extract('epoch' from current_timestamp) ELSE stamp1 END, 
    stamp2 = CASE WHEN stamp2 < stamp1 THEN extract('epoch' from current_timestamp) ELSE stamp2 END 
WHERE gid = in_gid 
AND (player1 = in_uid OR player2 = in_uid);