【问题标题】:How to reattempt inserting into database if there was already such unique value stored如果已经存储了这样的唯一值,如何重新尝试插入数据库
【发布时间】:2016-02-07 17:34:07
【问题描述】:

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

所以,问题是我想在我的 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_DUP_ENTRY 的可能性很小。现在是我的问题:

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

【问题讨论】:

    标签: javascript mysql node.js unique-key


    【解决方案1】:

    这应该就像将您的 generate-unique-value-and-insert 代码块包装到一个函数中一样简单,如果出现重复键,您可以重新调用:

    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 的调用只是将connection.query 的成功函数放入事件队列中,所以它不会吃光记忆。实际上,我关于使用 setImmediate 的部分答案是多余的,我将编辑答案以反映这一点。
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2010-12-29
    相关资源
    最近更新 更多