Как вставить запись, где не существует, и если существует, игнорировать ее с помощью mysql или knex и выразить JS - PullRequest
0 голосов
/ 11 октября 2019

Я хочу проверить свою базу данных, если значение уже существует, но не добавляйте это значение, а если не существует, добавьте это новое значение.

мой код

router.post('/additem', function(req, res, next){
  db('types').insert({type_name: req.body.getypename}).where('type_name', '!=', req.body.getypename).then(()=>{
     res.redirect('/additem?success=1')
  }).catch((err)=>{ res.redirect('/additem?'+err) })
})

1 Ответ

0 голосов
/ 12 октября 2019

Добро пожаловать в Stackoverflow!

Использование .count() будет одним из способов проверки существования записи перед ее добавлением. См. Нижеприведенную функцию countTypeNameRec в качестве примера.

Следующая функция addTypeNameRec затем складывает и вставляет счетчик, сначала проверяя количество записей, затем, если он равен нулю, добавляет запись.

См. Knex .count() ссылка для получения дополнительной информации об использовании .count(). (Для больших неиндексированных таблиц использование select * where xxx limit 1, вероятно, было бы лучшим выбором для повышения производительности.)

Второй метод: Я предполагаю, что это жесткое правило, которое не может иметь тип«Табличные записи с повторяющимися значениями поля type_name». Если это так, то если сделать это поле первичным ключом с помощью определения таблицы SQL в вашей базе данных (или создать уникальный индекс для таблицы для этого поля), это также не позволит пользователям создавать дубликаты записей. В этом случае оператор .insert() выдаст ошибку в дубликате записи. Но немного ошибочно интерпретировать ошибку, если вы хотите дать пользователю понятное сообщение об ошибке «Значение уже существует». Здесь - обсуждение этой проблемы.

Если вам не нужно возвращать пользователю некрасивую необработанную ошибку базы данных, которую он, вероятно, не поймет, тогда вы можете использовать этот второй методв упрощенном виде и просто вызовите функцию insertTypeNameRec из кода маршрутизации вместо функции addTypeNameRec (пропуская проверку счетчика).

Код

// count the records
//
function countTypeNameRec(input_type_name) {
   return db('types')
    .count('*')
    .where('type_name', input_type_name)
    .then((data)=>{
            return data[0].count
        })
}

// insert a new record
//
function insertTypeNameRec(input_type_name) {
   return db('types')
    .insert({type_name: input_type_name})
}

// Combine the count & insert - the real goal
//
function addTypeNameRec(input_type_name) {

   return countTypeNameRec(input_type_name)
     .then((rec_count) => {
        if (rec_count===0) {
            insertTypeNameRec(input_type_name) 
        } else {
            // we can return an already exists error from here
        }
     })
}

// Web routing code
//
router.post('/additem', function(req, res, next){

   const input_type_name = req.body.getypename;
   // we could validate our input here

   // for simplistic second method - call insertTypeNameRec() here instead
   return addTypeNameRec(input_type_name)
      .then(()=>{
            res.redirect('/additem?success=1')
       })
       .catch((err)=>{ 
            res.redirect('/additem?'+err) 
       })
})

// disclaimer: this code has not been tested

Халява (т.е. комментирует вещи, о которых вы не спрашивали) ... Я стараюсь разделить свои возможности на мельчайшие части / функции, которые я могу. Тогда становится супер просто устранять неисправности и тестировать каждый кусок. Я особенно стараюсь отделить код на уровне базы данных и связи. Затем можно просто заглушить веб-запросы и протестировать их отдельно от обработки на другом сервере.

...