MySQL Триггер: изменить значения столбца на INSERT - PullRequest
0 голосов
/ 02 мая 2020

У меня есть следующая таблица:

| uid (key) | version (key) | active | firstName |
|         1 |             0 |      0 | Piter     |
|         1 |             1 |      0 | Pater     |
|         1 |             2 |      1 | Peter     |

Как видите, столбцы ID и Версия создают комбинированный ключ. Идентификатор установлен как автоинкремент. Теперь у меня есть две проблемы:

1) Я хотел бы увеличить версию при каждой вставке, которую я выполняю, не читая значение версии последней существующей строки. 2) Я хотел бы установить для всех существующих строк для данного uid значение active = 0, поскольку вставленная запись должна быть активной.

Я попытался объединить оба шага в одном триггере:

DELIMITER $$
CREATE TRIGGER before_member_insert
BEFORE INSERT
ON members FOR EACH ROW
BEGIN
    DECLARE version INT;
    SELECT MAX(version) INTO version FROM members WHERE uid=new.uid;
    IF @version IS NULL THEN 
        new.version=0
    ELSE
        UPDATE members SET active=0 WHERE uid=uid;
    END IF;
    INSERT INTO members(version) VALUES(new.version);
END $$
DELIMITER ;

, но мой MySQL сервер просто говорит:

# 1064 - ошибка в синтаксисе SQL в .version = 0 ELSE UPDATE члены SET active = 0 ГДЕ uid = uid; КОНЕЦ I в строке 8

Можно ли достичь моих целей с помощью триггера? Как мне изменить его, чтобы он работал?

Спасибо!

1 Ответ

0 голосов
/ 02 мая 2020

Если бы это был я, я бы просто сделал это и оставил бы это ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,uid  INT NOT NULL
,firstName VARCHAR(12) NOT NULL
);

INSERT INTO my_table (uid,firstname) VALUES
(1,'Piter'),
(1,'Pater'),
(1,'Peter');

SELECT x.*
  FROM my_table x
  JOIN
     ( SELECT MAX(id) id FROM my_table GROUP BY uid ) y
    ON y.id = x.id;

+----+-----+-----------+
| id | uid | firstName |
+----+-----+-----------+
|  3 |   1 | Peter     |
+----+-----+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...