使用 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为触发码
我有以下简单的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为触发码