Предположим, у меня есть этот запрос (в сочетании с PHP)
INSERT INTO table (field1, field2, field3) VALUES (a, $field2, c) ON DUPLICATE KEY UPDATE field2 = IF(VALUES(field2) [ends up using DEFAULT(field2)], field2, VALUES(field2))
где $ field2 может быть
а. допустимое нормальное значение для вставки в field2 или
б. Строка «DEFAULT (field2)», которая вставляет любое значение по умолчанию для mysql поля (предположим, по умолчанию 22)
Теперь моя цель — сделать так, чтобы в части запроса UPDATE:
если произошел случай а.), то обновите столбец, указав значение $ field2, указанное пользователем. в противном случае, если произошел случай b.), оставьте строку как есть (т.е. не изменяйте данные)
в основном мне нужно заполнить часть запроса «[заканчивается использованием DEFAULT (field2)]», чтобы выполнить вышеуказанное
Теперь мой первый импульс заключается в выполнении ON DUPLICATE KEY UPDATE field2 = IF(VALUES(field2) = DEFAULT(field2), field2, VALUES(field2))
но тогда это также приведет к тому, что строка останется такой же, как и в случае а.), в котором $ field2 = 22, поскольку 22 является значением по умолчанию для mysql, следовательно, VALUES (field2) = DEFAULT (field2) равно TRUE, несмотря на тот факт, что в случае а.) мы хотим, чтобы 22 соответственно обновлялось вместо сохранения текущего значения
другими словами, как мне изменить этот запрос, чтобы он выполнял обновление только в том случае, если в него было явно вставлено значение, но не выполнял обновление, если «DEFAULT (field2)» в конце концов используется
Вы можете запустить MySQL в строгом режиме и установить для этого столбца значение NOT NULL
определение. Затем вместо попытки вставить значение по умолчанию в столбец, когда этот случай срабатывает, вы можете вставить NULL
, Это может привести к ошибке, что приведет к сбою запроса.
Я думаю, что это немного глупо, хотя. Мне нужно было бы лучше понять ваш сценарий использования, чтобы действительно увидеть, следует ли вам использовать другой шаблон вызова в целом.
Других решений пока нет …