Mysql Insert по условию

466
25 февраля 2017, 07:20

Доброго времени суток. В общем, есть у меня такая необходимость: Имеется таблица:

id, operator, stantion, data, errors, file

Суть заключается в чем - оператор (а их несколько) добавляет файл, и нужно занести это все в табличку. Каждый файл с определенной станции - столбец stantion, и вся загвоздка в том, что нужно заносить в таблицу УНИКАЛЬНЫЕ значения stantion ЗА ДЕНЬ. Т.е если оператор почему-то выгрузил отчет по одной и той-же станции за день два раза, мы второй раз это не пишем в БД. Пытался сделать как:

INSERT INTO import_file (`operator`,`stantion`,`data`,`errors`,`file`) VALUES ('$operator', '$stantion', '$data') WHERE ((SELECT COUNT(*) FROM import_file WHERE `data`='$data' AND `stantion`='$stantion' AND `operator`='$operator') = 0)

Естественно, ничего хорошего, кроме ругани MySQL не получил. Может что-то делаю не так, может я изобретаю велосипед, и для этого есть како-то стандартизированное решение?

Answer 1

Можно примерно так:

INSERT INTO import_file (`operator`,`stantion`,`data`,`errors`,`file`)
  select '$operator', '$stantion', '$data'
    from (select 1) X
   WHERE not exists(SELECT 1 FROM import_file
                     WHERE `data`='$data' AND `stantion`='$stantion'
                       AND `operator`='$operator'
                   )

Или сделайте уникальный индекс по полям data, stantion, operator и попытка вставки дубля в таблицу вернет ошибку, которую вы можете проанализировать и понять что запись была или воспользоваться конструкцией on duplicate key update.

НО, вы подставляете значения переменных непосредственно в запрос, что приводит к массе проблем и уязвимостей (до половины всех взломов сайтов в интернете происходят именно по этой причине). Поэтому никогда ни одной переменной непосредственно в текст запроса не подставляйте. Вместо этого используйте подготавливаемые запросы и привязку значений (bind_param).

Answer 2

В общем виде:

SELECT COUNT(*) AS total FROM import_file  WHERE stantion =  $stantion;
if(!total){
    INSERT ...
}else{ 
    UPDATE ...
}

Естественно, как отметил @Moonvvell, это в файле модели (или где вы отправляете запросы).

READ ALSO
Электронный дневник [требует правки]

Электронный дневник [требует правки]

Можете отправить готовые исходники электронного дневника

390
Подключение php файлов к wordpress

Подключение php файлов к wordpress

Существует форма для заявки пользователя , где указан атрибут action = "handlerphp"

301
помогите настроить auth в laravel 5.3!

помогите настроить auth в laravel 5.3!

Здравствуйте, делаю shopping-cart по урокам youtube-пользователя Mindspace (https://wwwyoutube

315
Соединение с mysql через туннель SSH используя php

Соединение с mysql через туннель SSH используя php

Доброго времени сутокВозникла следующая загвоздка:

535