如何避免在节点mysql中插入重复记录?

时间:2018-11-13 09:11:33

标签: mysql node.js

在这里我插入用户详细信息username,emailid和contactno,而userid是用户表的主键。

我的查询是,当我插入重复的用户名或emailid时,如果在表中听到重复的记录,则不允许插入记录,这是怎么可能的?

app.js

app.post('/saveNewUserDetails',function(req,res){
  var form = new multiparty.Form();
  form.parse(req, function(err, fields, files){ 
    connection.query("INSERT INTO user (username,emailid,contactno) VALUES (?,?,?)", [fields.username,fields.emailid,fields.contactno] , function (error, results, fields) {
     if (error) throw error; 
      res.send({
        'status':'1',
        'success': 'true',
        'payload': results,
        'message':'New user Is saved'
      });
    });
  });
});

用户

userid(primary key)    username    emailid            contactno
  1                     user-1     user1@user1.com    1234567890 
  2                     user-2     user2@user2.com    1234444444

3 个答案:

答案 0 :(得分:1)

您应在CREATE语句中将usernameemailid设置为UNIQUE字段。

答案 1 :(得分:1)

对于每个条目,我们都无法检查该记录在数据库中的存在,因为这需要一些时间。

,因此我们将用户名和emailid设置为表中的UNIQUE字段。 因此,每当我们尝试向表中插入重复元素时,都会出现Duplicate key错误。

现在,我们将把该错误作为一种优势,通过简单地处理它来加快过程。

// pseudo code
// we are simply ignoring it
if( error & error != "ER_DUP_ENTRY" ){
  // do normal error handling
}

这是避免重复插入的最快解决方案

答案 2 :(得分:0)

怎么可能?-检查带有user表中记录的要发送给API的字段。确保它们不存在。

有关客户端应用程序的更多详细信息,我建议在插入之前检查数据库表是否存在记录。

这是您的问题的解决方案:

app.post('/saveNewUserDetails',
  async (req,res) => {
    try {
      const {fields} = await parseRequestBody(req);
      const {username, emailid, contactno} = fields;
      console.log('/saveNewUserDetails', 'fields:', fields); // for debug purposes

      const exists = await userExists(username, emailid);
      if (exists) throw new Error('User data already exists');

      const result = await createUser(username, emailid, contactno);
      res.status(201).send({
        'status': '1',
        'success': 'true',
        'payload': result,
        'message': 'New user Is saved'
      });
    }
    catch (error) {
      res.status(400).send({
        'success': false,
        'message': error.message
      }); 
    }
  }); 

const parseRequestBody = request => {
  return new Promise((resolve, reject) => {
    const form = new multiparty.Form();
    form.parse(request, (error, fields, files) => {
      if (error) return reject(error);
      resolve({fields, files});
    });
  });
};

const userExists = (username, emailid) => {
  return new Promise((resolve) => {
    connection.query(
      'SELECT userid FROM user WHERE username = ? OR emailid = ? LIMIT 1',
      [username, emailid],
      (error, result) => {
        if (error) return reject(error);

        if (result && result[0]) {
          console.log('User exists:', result); // for debug purposes
          return resolve(true);
        }

        resolve(false);
      });
  });
};

const createUser = (username, emailid, contactno) => {
  return new Promise((resolve) => {
    connection.query(
      'INSERT INTO user (username, emailid, contactno) VALUES (?, ?, ?)',
      [username, emailid, contactno],
      (error, result) => {
        if (error) return reject(error);

        resolve(result);
      });
  });
};