Еще раз. ON DUPLICATE KEY UPDATE VALUES() вам потребуется только в частном случае. Когда вы заведомо знаете что делать в этой таблице, когда у нее какая-то особая рояль, когда вы хотите одним махом либо добавить новую запись, либо обновить НЕуникальные поля имеющейся.
Например такой таблицей может быть таблица конфига. Прилетела новая опция - добавилась. Прилетела старая - обновилась. Имя настройки уникальное, значение настройки меняется. Одним запросом вы оперируете весь конфиг не проверяя сперва есть такая запись - то обновить, нет такой записи - то добавить. Инструкция выше передается в СУБД и все проверки делаются там.
Такая таблица может быть встроена в рамку как служебная. Для нее не нужна модель, это системный компонент, dll.
В рамках общего применения вам вы ничего не проверяете, потому что СУБД по дефинициям сама все проверит и выкинет вам мессагу если проверка не прошла. Оператор не проверил есть ли такой клиент в БД? СУБД вашему скрипту скажет, а ваш скрипт переведет оператору: Нельзя делать дубликаты записей.
Насчет примари вообще. Я тут распинаюсь, понимаешь, а между тем есть такая приблуда как DAO где английским языком черным по белому написано
Please use for each table primary key and this column type must be int.
http://phpdao.com/