ЗНАЧЕНИЕ «функция» в части запроса UPDATE относится к именам столбцов, которые вы использовали в части INSERT. То, что вы хотите, это:
INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id)
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY
UPDATE keyword=VALUES(keyword), client_id=VALUES(client_id), desc_id=VALUES(desc_id);
Таким образом, вы можете вернуться к любым значениям, которые вы хотели вставить; они могут быть вычисленными значениями или они могут быть получены из запроса SELECT. Когда вы входите в более сложные запросы, я думаю, вы найдете это гораздо более удобным, чем то, что вы пытались сделать.
В большинстве случаев, когда вы используете ON DUPLICATE KEY UPDATE, у вас не будет причин делать что-либо кроме
UPDATE x=VALUES(x), y=VALUES(y), z=VALUES(z)
для любых столбцов, которые вы хотите вставить.
Если вы действительно просто хотите вставить значения, которые вы указали для различных столбцов, то пропустите VALUES (); Вы можете просто сделать это так:
INSERT INTO `generic_client_data` (id, keyword, client_id, desc_id)
VALUES (NULL, 'qqqq', 115, 0) ON DUPLICATE KEY
UPDATE keyword='qqqq', client_id=115, desc_id=0
Однако для этого требуется, чтобы вы вводили все значения дважды, и каждый раз, когда вы меняете оператор, вы должны убедиться, что все совпадает.
Не мешало бы прочесть руководство, как подсказывает сообщение об ошибке:
http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html