2016-11-12 33 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爲觸發代碼

相關問題