gpt4 book ai didi

javascript - 在 MySQL 上使用 Promise 进行并行插入查询失败

转载 作者:行者123 更新时间:2023-11-30 11:52:58 24 4
gpt4 key购买 nike

我在 Node.js 中编写了用于并行运行插入查询的代码,并且我也在使用 Promise.js。

但代码失败并引发“重复主键”条目的异常。

代码如下,

 var Promise = require("promise");
var mySql = require("mysql");
var _ = require("underscore");

var connection = mySql.createConnection({
host : "localhost",
user : "root",
password : "rahul",
database : "testDb" //schema
});

connection.connect();

function insertDept(name){
return new Promise(fn);

function fn(resolve,reject){
getMaxDept().then(function(rows){
var deptId = rows[0]["DeptId"];
deptId = (_.isNull(deptId) === true) ? 125 : deptId;
var sql = "insert into departmentTbl values("+deptId+",'"+name+"')";
console.log(sql);
connection.query(sql,function(err,rows,fields){
if(err){
console.log(err);
return reject(err);
}else{
return resolve(rows);
}
});

}).catch(function(error){
return reject(error);
});
}//fn
}//insertDept

function getMaxDept(){
return new Promise(fn);

function fn(resolve,reject){
var sql = "select max(deptId) + 1 as 'DeptId' from departmentTbl";

connection.query(sql,function(err,rows,fields){
if(err){
console.log(err.stack);

return reject(err);
}else{
return resolve(rows);
}
});
}// fn
} //getMaxDept

function createDeptForAll(){
var promiseObj = [];

if(arguments.length > 0){
_.each(arguments,callback);
}else{
throw "No departments passed";
}

function callback(deptName){
promiseObj.push(insertDept(deptName))
}

return Promise.all(promiseObj);
}//createDeptForAll


createDeptForAll("Archiology","Anthropology").then(function(createDepartment){
createDepartment.then(function(rows){
console.log("Rows inserted "+rows["affectedRows"]);
}).catch(function(error){
console.log(error);
}).done(function(){
connection.end();
});
});

当我运行上面的代码代码时,输出是

rahul@rahul:~/myPractise/NodeWebApp/NodeMySqlv1.0$ node queryUsingPromise02.js 
insert into departmentTbl values(125,'Archiology')
insert into departmentTbl values(125,'Anthropology')
{ [Error: ER_DUP_ENTRY: Duplicate entry '125' for key 'PRIMARY'] code: 'ER_DUP_ENTRY', errno: 1062, sqlState: '23000', index: 0 }

由于 Department Id 是主键并且 promises 并行运行,第二个部门的插入查询的主键失败。

如您所见,在任何插入查询之前,我获取部门的最大值 + 1。

如果上述查询失败,我分配“125”。

现在,我应该更改哪些内容才能使上面编写的代码运行。

我应该使用“插入前”的触发器在数据库级别本身计算“部门 ID”主键的下一个值,还是应该在我自己的 Node.js 代码中做一些事情?

最佳答案

这个问题并不局限于 Node 或 JavaScript,但任何尝试并行写入 SQL 数据库的技术都会遇到这个问题。在这种情况下生成唯一 ID 并非易事。

如果您可以选择这样做,请在您的数据库中设置您的 id 字段 AUTO_INCREMENT,这将为您在这种情况下省去很多麻烦。

More about AUTO_INCREMENT.

关于javascript - 在 MySQL 上使用 Promise 进行并行插入查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38924236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com