我创建了一个触发器来帮助我在插入行时创建主键。我想获得我刚插入的主键。但因为主键不是auto_increment我不能使用
SELECT LAST_INSERT_ID();
那我怎样才能获得主键?
这是触发器
CREATE TRIGGER before_insert_user_info
BEFORE INSERT ON USER_INFO
FOR EACH ROW
SET new.uID = CONCAT('U', ((SELECT MAX(CAST(SUBSTRING(uID, 2, length(uID)) AS UNSIGNED)) FROM USER_INFO)+1));
这是插入
INSERT INTO USER_INFO(name) VALUES ('Peter');
答案 0 :(得分:0)
依靠触发器生成主键有点不寻常。无法从触发器中检索数据(例如,它没有返回值)。但您可以重复使用tigger的逻辑来检索生成的值:
INSERT INTO user_info VALUE (@newUID, ...);
SELECT MAX(CAST(SUBSTRING(@newUID, 2, LENGTH(@newUID)) AS UNSIGNED)) AS last_insert_id
FROM user_info; -- this is the generated value
在事务中包装这两个语句,以确保不在其间插入新用户。
作为替代方案,我会创建另一个INT AUTO_INCREMENT
列,以便您可以在插入LAST_INSERT_ID()
之后检索新行;
虽然我们在这里,但我会将这个新字段设为(surrogate)主键。相同的触发器仍然可以生成“公共”用户ID,但之后我们将回到更常见的架构。
最后的想法:您是否真的需要使用U
前缀存储您的用户ID?也许您只能存储一个普通的INT
值,并在选择上预先U
。