【问题标题】:Output primary key after insert a row in Mysql在Mysql中插入一行后输出主键
【发布时间】:2014-01-26 13:39:14
【问题描述】:

我创建了一个触发器来帮助我在插入行时创建主键。我想获得我刚刚插入的主键。但是因为主键不是 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');

【问题讨论】:

  • 只能在AUTO_INCREMENT中使用,但我的主键不是AUTO_INCREMENT。
  • 能否提供插入触发器的代码示例?
  • 你可以使用“SELECT MAX(uID) FROM USER_INFO”
  • 在你的触发器中,只有为null的时候才设置值,需要id的时候自己生成。

标签: mysql triggers phpmyadmin


【解决方案1】:

依靠触发器来生成主键有点不寻常。无法从触发器中取回数据(例如,它没有返回值)。但是您可以重用跳跳虎的逻辑来检索生成的值:

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,但我们会回到更常见的架构。

最后的思考:您真的需要存储您的用户 ID 与 U 前缀吗?也许您可以只存储一个普通的 INT 值,然后在选择时添加 U

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多