MYSQL Обновление дубликатов ключей, только если в записи есть определенное значение

0

У меня есть таблица 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. Заранее спасибо.

Теги:

1 ответ

0

Основываясь на вашей логике, я думаю, что первичный ключ должен быть либо (personId, closed) либо (personId, dateX, closed). Я не могу сказать из вашего описания. Вы хотите:

  1. До двух записей для каждого человека, один открыт и один закрыт?
  2. До двух записей для каждого человека в каждый день, один открыт и один закрыт?
  3. Несколько закрытых записей ставят только один открытый?

Исходя из логики в вопросе, я угадываю (2). Если (3), то это, вероятно, неверный подход.

  • 0
    На самом деле, ни один. Первичный ключ должен быть (personId, dateX) как есть. Для каждого человека в каждый день существует одна запись, и пока не наступит подходящее время, она полностью доступна для модификации. Однако, когда эти записи обрабатываются сценарием, они должны храниться в базе данных для записи, но больше не должны подвергаться изменению. Конечно, я мог бы переместить их в другую таблицу, но, если это возможно, мне бы очень хотелось, чтобы они оставались в одной таблице, меняя только флаг «закрыто», чтобы одна и та же запись больше не могла быть изменена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню