发布
社区首页 >问答首页 >MySQL触发器:在插入时更改列值

MySQL触发器:在插入时更改列值
EN

Stack Overflow用户
提问于 2020-05-02 17:48:54
回答 1查看 50关注 0票数 0

我有下表:

代码语言:javascript
代码运行次数:0
复制
| uid (key) | version (key) | active | firstName |
|         1 |             0 |      0 | Piter     |
|         1 |             1 |      0 | Pater     |
|         1 |             2 |      1 | Peter     |

如您所见,ID和Version列创建了一个组合键。ID设置为自动递增。现在我确实有两个问题:

1)我想在每次插入时增加版本,而不读取最后一个现有行的版本值。2)我想将给定uid的所有现有行都设置为active=0,因为插入的记录应该是活动记录。

我尝试在一个触发器中组合这两个步骤:

代码语言:javascript
代码运行次数: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 - .version=0的SQL语法错误,否则UPDATE members SET active=0 WHERE uid=uid;在第8行结束i

是否可以使用触发器来实现我的目标?我需要如何更改它才能正常工作?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-05-02 18:37:11

如果是我的话,我会这么做,然后就这样...

代码语言:javascript
代码运行次数:0
复制
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     |
+----+-----+-----------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61557368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档