使用 auto_increment 值作为复合 UID 的一部分 - 高效的查询方法?

Using auto_increment values as part of compound UID's - efficient query methods?

我有以下简单的table:

员工:

Name (VARCHAR), Increment (INT, auto increment), Uid (INT)

例如,Uid 可以由增量值与另一个标识符(例如 mac 服务器地址)连接而成。

目前我的 node.js 应用程序(使用 node-mysql 绑定)创建了一个新行来生成自动增量值,然后取这个值:

var first_payload = {
   name: "Example"
}
connection.query("INSERT INTO employees SET ?", first_payload, function(error, result){
  var auto_increment_value = result.insertId; //Capture auto increment value
});

然后我获取自动增量值,将它与另一个标识符连接起来并作为 Uid 插入回行中:

var second_payload = {
  Uid: concatenated_auto_increment,
}
connection.query("INSERT INTO employees SET ? WHERE Increment = '"+auto_increment_valiue+"' ", second_payload, function(error, result){
  //...
})

有没有更有效的方法来执行这个操作?

比如生成自动增量值然后在同一个查询中创建Uid? 或者也许创建自动增量的初始查询可以 return 一个指向该行的直接指针,以消除第二个查询搜索 table?

的需要

你的concatenated_auto_increment能被MySql服务器计算出来吗?如果是这样,您可以在数据库中设置触发器以在创建新记录时 运行。

CREATE TABLE employees (`name` varchar(255), `increment` int auto_increment primary key, `uid` int);

DELIMITER //
CREATE TRIGGER add_uid BEFORE INSERT ON employees 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='employees');
   SET NEW.uid = CONCAT(next_id, 39839483);
END;//
DELIMITER ;

然后当你像这样调用插入语句时

INSERT INTO employees SET name = 'Dave';
INSERT INTO employees SET name = 'Joe';

MySQL会自动填写uid字段:

SELECT * FROM test.employees;
+------+-----------+-----------+
| name | increment | uid       |
+------+-----------+-----------+
| Dave |         1 | 139839483 |
| Joe  |         2 | 239839483 |
+------+-----------+-----------+
2 rows in set (0.00 sec)

注:credit to Resegue为触发码