1

主キーである列に乱数をデータベースに挿入する関数があります。

番号がすでにデータベースにある場合に問題が発生します。プロセスを再度呼び出して番号を変更し、もう一度挿入してみますが、私はJavascriptの初心者なので、これまでに作成したコードを次に示します。

乱数を作成する関数:

編集2:

function crearNumero()
{ 
    var aNumeros = new Array
    (
        '1', '2', '3','4','5','6','7','8','9'
    ); 
    var cNumero = aNumeros[Math.floor(Math.random()*aNumeros.length)]; 


    return cNumero;
} 

データベースに挿入する関数:

function insertarNumero(Callback)
{
  var sql='INSERT INTO tabla_numero(numero) VALUES(?)';
  var params= [crearNumero()];

  client.query(sql,params,function(err,rows)
  {
    if(err){
      arguments.callee(Callback);
    } else {
      return Callback(params[0]);
    }
  });
} 

だから私はこれで番号を挿入しようとします:

insertarNumero(function(args)
     {
       console.log('el numero ingresado fue '+args);
       console.log('the number inserted was '+args);
        });

このコードは問題ありませんが、番号がすでに存在する場合、プロセスを繰り返す方法がわかりません。

誰かが私にこの問題を解決する方法について教えてもらえますか?

4

3 に答える 3

1

1 つの可能性は、乱数の代わりに自動インクリメントです。これはもっと快適でしょう。

本当に乱数を挿入したい場合は、unique indexonを作成する必要がありますnumero。クエリを呼び出した後、クエリが成功したかどうかを確認できます。失敗した場合は、番号が既に存在していたためかどうかを確認できます。(mysql サーバーから返されたエラー番号を確認してください。) 失敗した場合は、新しい乱数を作成し、関数を再度呼び出して新しい番号を挿入します。

PS: 現時点では、データベースに 9 行しか保存できませんでした。

于 2012-07-20T22:16:28.713 に答える
1

次のように、実際にコールバック関数を関数に渡しますinsertarNumero

function anotherInsert() {
    insertarNumero(crearNumero(), anotherInsert);
}

これにより、insertarNumero失敗した場合に関数がこの関数を再呼び出しします。たとえば、接続エラーが発生した場合などに、複数回挿入を試行しないように、おそらくエラー コードも確認する必要があることに注意してください。

編集: 問題の解決にまだ問題があるため、次の 2 つの方法が役立つ可能性があります。

function insertarNumero(callback) {
    var sql = 'INSERT INTO tabla_numero(numero) VALUES(?)';
    var params = [crearNumero()];

    client.query(sql, params, function(err, rows) {
        if (err) {
            callback(err);
        } else {
            callback();
        }
    });
}

function insert() {
    insertarNumero(function(err) {
        if (err) {
            console.log('failed to insert');
            insert();
        } else {
            console.log('inserted');
        }
    });
}

そして、本当にその機能が必要ない場合はinsert()...

function insertarNumero(callback) {
    var sql = 'INSERT INTO tabla_numero(numero) VALUES(?)';
    var params = [crearNumero()];

    client.query(sql, params, function(err, rows) {
        if (!err) {
            if (callback) {
                callback(params[0]);
            }
        } else {
            //TODO: Check the error code
            insertarNumero(callback);
        }
    });
}

insertarNumero(function(args) {
    console.log('the number inserted was ' + args);
});
于 2012-07-20T22:21:08.443 に答える
-1

もう一度自分自身を呼び出して、次を使用して同じ Callback を渡しarguments.calleeます。

function insertarNumero(Callback)
{
  var sql='INSERT INTO tabla_numero(numero) VALUES(?)';
  var params= [crearNumero()];

  client.query(sql,params,function(err,rows)
  {
    if(err){
      arguments.callee(Callback);
    } else {
      return Callback();
    }
  });
} 

arguments.calleeこの関数の名前を使用するのと同じですinsertarNumero

于 2012-07-20T22:16:35.790 に答える