【发布时间】: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