2016-11-12 11 views
0

我有以下简单的表:将auto_increment值用作复合UID的一部分 - 有效的查询方法?

雇员:

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

例如,在UID可以由与另一个标识符(服务器的例如MAC地址)级联增量值的。

目前(使用节点mysql的绑定)我的Node.js应用程序创建一个新的行生成自动递增值,则取该值:

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? 也许最初的查询创建自动增量可能会返回一个直接指向该行的指针,以删除第二个查询来搜索表的需求?

+0

[有是](http://stackoverflow.com/questions/5972446/insert-autoincrement-into-second-co lumn)是这种查询的一个很好的例子。 – aring

+0

@链接的页面没有帮助 - 它不是特定于node-mysql的,它没有显示如何完成我在单个查询中描述的操作,而不是两个。 –

+0

Just FYI,line'connection.query(“INSERT INTO employees SET?WHERE Increment ='”+ auto_increment_valiue +“'”,second_payload,function(error,result){'could be'connection.query(“INSERT INTO employees SET ?WHERE Increment =?“,[second_payload,auto_increment_valiue],function(error,result){'。此外,如果您正在寻找一种方法在单个查询中执行您想要的操作,我认为这是不可能的。如果您的底层引擎支持它,您可能想要将这两个SQL命令包装在一个事务中。您可能不想保留一半的行。 – Dave

回答

2

您的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为触发代码

相关问题