首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您能在一个语句中访问MySQL中的自动增量值吗?

您能在一个语句中访问MySQL中的自动增量值吗?
EN

Stack Overflow用户
提问于 2009-01-22 12:57:20
回答 10查看 32.7K关注 0票数 23

我有一个MySQL数据库,其中包含一个用户表。表的主键是'userid',它被设置为自动增量字段。

我想要做的是,当我将一个新用户插入到表中时,使用与“userid”字段中的“默认_赋值”字段中的自动增量所创建的值相同的值。

例如:

我想要一份这样的声明:

代码语言:javascript
复制
INSERT INTO users ('username','default_assignment') VALUES ('barry', value_of_auto_increment_field())

所以我创建用户'Barry','userid‘生成为16 (例如),但我也希望'default_assignment’具有相同的值为16。

有什么办法能做到这一点吗?

谢谢!

更新:

谢谢你的回复。default_assignment字段不是多余的。default_assigment可以引用user表中的任何用户。在创建用户时,我已经有了一个表单,它允许选择另一个用户作为default_assignment,但是在某些情况下,需要将其设置为同一个用户,因此我提出了一个问题。

更新:

好的,我已经尝试了更新触发器的建议,但还是不能让它起作用。下面是我创建的触发器:

代码语言:javascript
复制
CREATE TRIGGER default_assignment_self BEFORE INSERT ON `users`  
FOR EACH ROW BEGIN
SET NEW.default_assignment = NEW.userid;
END;

但是,当插入新用户时,default_assignment总是设置为0。

如果我手动设置userid,那么default_assignment就会被设置为userid。

因此,自动分配生成过程显然发生在触发器生效之后。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-07-26 11:46:27

不需要创建另一个表,max()将遇到与表的auto_increment值相关的问题,请执行以下操作:

代码语言:javascript
复制
CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   DECLARE next_id;
   SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl');
   SET NEW.field = next_id;
END

我声明next_id变量,因为通常它将以其他方式使用(*),但是您可以直接使用new.field=(选择.)

代码语言:javascript
复制
CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   SET NEW.field=(SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl');
END

此外,在(选择string字段)的情况下,您可以使用CAST值;

代码语言:javascript
复制
CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   SET NEW.field=CAST((SELECT aStringField FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl') AS UNSIGNED);
END

(*)自动命名图像:

代码语言:javascript
复制
SET NEW.field = CONCAT('image_', next_id, '.gif');

(*)创建一个散列:

代码语言:javascript
复制
SET NEW.field = CONCAT( MD5( next_id ) , MD5( FLOOR( RAND( ) *10000000 ) ) );
票数 34
EN

Stack Overflow用户

发布于 2014-04-24 07:31:02

尝尝这个

代码语言:javascript
复制
INSERT INTO users (default_assignment) VALUES (LAST_INSERT_ID()+1);
票数 3
EN

Stack Overflow用户

发布于 2009-01-22 13:16:13

看到last_insert_id()在这种情况下不能工作,是的,触发器将是实现这一目标的唯一途径。

不过,我确实问自己:您需要这种功能做什么?为什么要将用户id存储两次?就我个人而言,我不喜欢存储这样的冗余数据,我可能会在应用程序代码中解决这个问题,方法是使那个不祥的default_assignment列为空,并在我的应用程序代码中使用用户id (如果default_assignment为NULL )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/469009

复制
相关文章

相似问题

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