【问题标题】:MySQL Trigger: Change column values on INSERTMySQL 触发器:在 INSERT 上更改列值
【发布时间】:2020-08-16 19:43:05
【问题描述】:

我确实有下表:

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

如您所见,列 ID 和版本创建了一个组合键。 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 - .version=0 处的 SQL 语法错误 别的 UPDATE 成员 SET active=0 WHERE uid=uid; END I 在第 8 行

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

谢谢!

【问题讨论】:

  • 是否需要存储版本?似乎存储一个简单的 AI 会更简单。如有必要,我们总是可以计算版本(和活跃)。
  • @version 来自哪里?请添加您的表定义和触发代码。
  • 是的,需要存储版本才能了解顺序。此外,这些版本中的任何一个都可能是活动版本(例如,当最后一个版本不正确时)。我陈述了我触发的 SQL 命令,它导致了版本错误:插入成员(uid、active、firstName)VALUES(1、1、'Peter')
  • 我不关注; '插入的记录 [是] 活动记录',或者,它不是。
  • 好的,我重新表述了我的问题。

标签: mysql triggers auto-increment


【解决方案1】:

如果是我,我会这样做,然后就这样……

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     |
+----+-----+-----------+

【讨论】:

  • 您好 Strawberry,您正在自己设置 uid,但如果该行是新的,则这是一个未知数字。因此,我在考虑两个 AI 字段,但我必须使用的 MySQL 服务器不支持。
  • @AntonSack 抱歉,我看不出这个论点的相关性。欢迎您编辑您的问题,扩展我上面提供的示例以证明/解释您的观点。
  • 任何行都可以是活动行。它不必是“版本”号最高的那个。
  • 是的。你一开始就说你只做 INSERT。
  • 触摸。我想说总是添加行。唯一更新的是活动标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2013-01-24
  • 2015-09-18
  • 2021-09-08
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多