一尘不染

您可以在一条语句中访问MySQL中的自动增量值吗?

mysql

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

我想做的是,当我向表中插入新用户时,要使用自动增量在另一个字段“ default_assignment”的“用户ID”字段中创建的值。

例如

我想要这样的声明:

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。

如果我手动设置用户标识,则default_assignment确实会设置为用户标识。

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


阅读 296

收藏
2020-05-17

共1个答案

一尘不染

无需创建另一个表,并且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 ) ) );
2020-05-17