У меня есть таблица MySQL с 4 столбцами:
personId(int)
dateX(date)
ratio(decimal 11,2)
closed(boolean, e.g. tintyint(1)).
personId и dateX - первичный ключ. 3 первых столбца - это те, которые действительно используются, четвертый служит индикатором, что эта запись больше не должна изменяться, так как это значение используется для некоторых вычислений, поэтому оно должно оставаться статичным. Я использовал этот запрос:
INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=:ratio;
И все прошло отлично. Однако он не принимает никаких "закрытых" записей. Я попытался сделать это так:
INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=IF(closed=1,ratio,:ratio);
но это не сработает. Если есть ЛЮБАЯ запись с закрытым = 1, она не обновляет ни один из них. Я также пробовал другой тип запроса, который я нашел в Интернете:
INSERT INTO ratioTable(personId,dateX,ratio) VALUES (:personId,:dateX,:ratio) ON DUPLICATE KEY UPDATE personId=:personId,dateX=:dateX, ratio=:ratio WHERE closed!=1;
но это дает мне ошибку MySQL.
Не могли бы вы указать мне в правильном направлении, что я делаю неправильно? Мне нужно выполнить запрос, который вставляет запись, но если уже есть запись с тем же самым первичным ключом, тогда он должен проверить, включен ли "закрытый" параметр! = 1 и обновить эту запись. Я не хочу запускать запрос SELECT заранее, и я считаю, что должен быть способ выполнить его только с одним запросом MySQL. Заранее спасибо.
Основываясь на вашей логике, я думаю, что первичный ключ должен быть либо (personId, closed)
либо (personId, dateX, closed)
. Я не могу сказать из вашего описания. Вы хотите:
Исходя из логики в вопросе, я угадываю (2). Если (3), то это, вероятно, неверный подход.