Javascript 如果已经存储了这样的唯一值,如何重新尝试插入数据库

Javascript 如果已经存储了这样的唯一值,如何重新尝试插入数据库,javascript,mysql,node.js,unique-key,Javascript,Mysql,Node.js,Unique Key,我搜索了所有现有的模式,但没有找到任何东西 所以,我想在我的MySQL数据库中存储一些唯一的key值。我在服务器端生成它,如下所示: var pc = require('password-creator'); var key = pc.create(20); // "f9Wp>=\qJqx]rwwbbiQ8 然后我将其发送到数据库: connection.query(db_query, function (err, rows, fields) { if(err){

我搜索了所有现有的模式,但没有找到任何东西

所以,我想在我的MySQL数据库中存储一些唯一的
key
值。我在服务器端生成它,如下所示:

var pc = require('password-creator');
var key = pc.create(20); //  "f9Wp>=\qJqx]rwwbbiQ8
然后我将其发送到数据库:

 connection.query(db_query, function (err, rows, fields) {
    if(err){
        if(err.code == "ER_DUP_ENTRY"){
            // here I could attempt again with newly generated key by
            // calling another query to database but this is giving me 
            // a limited amount of such attempts
        }
    }
    else{
        // there was no duplicate
    }
});
因此,一切似乎都很好,但有一个微小的可能性获得
ER\u DUP\u条目
。现在是我的问题:


如何正确解决这种情况?我的意思是,我总是想在数据库中输入一些
值。我想到了循环,但这感觉很愚蠢,因为它是对数据库的异步查询。在这种情况下,我基本上是在寻找正确的方法。

这应该很简单,只要将生成唯一值包装起来,并将代码块插入到一个函数中,如果出现重复键,您可以重新调用该函数:

function tryToStoreUnique()
{
    var db_query = buildDbQuery(pc.create(20));
    connection.query(db_query, function (err, rows, fields) {
    if(err) {
        if(err.code == "ER_DUP_ENTRY"){
           // you can add counter to avoid lock if most of unique space is occupied
           tryToStoreUnique();
        }
    }
    else{
        // there was no duplicate
    }
  });
}

这应该很简单,只需包装生成唯一值并将代码块插入到一个函数中,如果出现重复键,则可以重新调用该函数:

function tryToStoreUnique()
{
    var db_query = buildDbQuery(pc.create(20));
    connection.query(db_query, function (err, rows, fields) {
    if(err) {
        if(err.code == "ER_DUP_ENTRY"){
           // you can add counter to avoid lock if most of unique space is occupied
           tryToStoreUnique();
        }
    }
    else{
        // there was no duplicate
    }
  });
}

所以递归方法——好的;)是的,从严格的数学意义上讲,这是一种递归方法,但请记住,
tryToStoreUnique
的调用只会将
连接。query
的success函数放入事件队列中,因此不会占用内存。实际上,我关于使用
setImmediate
的部分答案是多余的,我将编辑答案以反映这一点是的,从严格的数学意义上讲,这是一种递归方法,但请记住,
tryToStoreUnique
的调用只会将
连接。query
的success函数放入事件队列中,因此不会占用内存。实际上,我关于使用
setImmediate
的部分答案是多余的,我将编辑答案以反映这一点。