当前位置:  开发笔记 > 后端 > 正文

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

如何解决《你能在一个语句中访问MySQL中的自动增量值吗?》经验,为你挑选了1个好方法。

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

我想要做的是当我在表中插入一个新用户时,使用自动增量在另一个字段'defaultidass'中的'userid'字段中创建的相同值.

例如

我想要这样的声明:

INSERT INTO users ('username','default_assignment') VALUES ('barry', value_of_auto_increment_field())

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

请问有什么方法可以实现吗?

谢谢!

更新:

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

更新:

好的,我已经尝试了更新触发器建议,但仍然无法使其工作.这是我创建的触发器:

CREATE TRIGGER default_assignment_self BEFORE INSERT ON `users`  
FOR EACH ROW BEGIN
SET NEW.default_assignment = NEW.userid;
END;

但是,插入新用户时,default_assignment始终设置为0.

如果我手动设置用户ID,则default_assignment将设置为userid.

因此,在触发生效后,自动分配生成过程显然会发生.



1> Resegue..:

没有必要创建另一个表,并且max()将根据表的auto_increment值出现问题,请执行以下操作:

CREATE TRIGGER trigger_name BEFORE INSERT ON tbl FOR EACH ROW
BEGIN
   DECLARE next_id INT;
   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 =(select ...)

(*) To auto-name an image:
SET NEW.field = CONCAT('image_', next_id, '.gif');
(*) To create a hash:
SET NEW.field = CONCAT( MD5( next_id ) , MD5( FLOOR( RAND( ) *10000000 ) ) );


这对高度并发的系统或多记录插入不起作用......
在高度并发使用的innoDB表格式中,它将锁定子查询的结果,避免一行选择另一行的自动增量.我已经做了一些测试,在随机的10到1000毫秒内发出了1200个请求,每秒输出500个插入,受服务器容量的限制.
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有