Попробуй немного изменить представление о программировании. Воспринимай все как "источники данных".
Есть у тебя база - это источник.
Есть у тебя пользователь - это тоже источник, НО временный (!).
Заранее назначать идентификатор нужно только в том случае, если тебе нужно сохранять и потом восстанавливать (навсегда, а не временно). Ты можешь присвоить ID сразу от пользователя, а потом зачем-то делать соответствие база-пользователь через "внешний id" (который ты заранее в программе присвоил) - но пользователь сам не сохраняет свои данные, он отдает их тебе, поэтому ему ID без надобности.
А вот базе твоей ID - нужен. Потому пользователь заполняет поля, жмет сохранить, а уже потом ты проверяешь - было ли в твоем источнике такая запись по некоторым критериям - например - по символьному коду "Гриша" - "grisha".
Почему программисты любят цифры? Потому что они уникальны в рамках мира. В любых кодировках, в любых языках, строчные или прописные, арабские цифры все равно выглядят как арабские цифры и при поиске соответствия - вероятность найти результат - выше.
Пользователь же вводит русский текст - то пробел лишний добавит, то символ непечатаемый напишет, то букву в английском языке поставит, которая выглядит так же как и русская. При поиске соответствия это будет причиной добавить новую запись, не найдя старую.
Чтобы уменьшить такую вероятность, ты:
а) в идеальном случае рассказываешь ему про ID и даешь выбрать записи из списка, а список - привязывает уже к ID
б) приводишь введенный им текст по собственному алгоритму - вырезая лишние пробелы, и понимая что в конце получится более менее адекватная строка для сверки - символьный код. Но будь внимателен - алгоритм этот добавляет и другую проблему - введет пользователь два пробела после имени - наверное он ожидал, что это будет другое имя, раз два пробела. И когда он увидит "запись уже есть" - у него возникнет вопрос. Дизайном это нужно обыграть, запретами и тд.
Таким образом ID - это указатель (!) - как в жизни - указывает "в-туда" - на место хранения записи в конкретной системе. Если ты сделаешь ID в пределах своей программы (пока она запущена) - то в твоей базе тебе придется делать связь "время_запуска_ID_программы_ID_базы" - а это ужас сколько проблем - работа с временными интервалами.
Используй ID чтобы пронумеровать запись в конкретном источнике, а второе поле - внешний ID - чтобы сделать связь с другим источником, и постарайся, чтобы эта связь не была забыта со временем.
Например при работе с Европейской системой SAP-кодов - мы имеем следующую проблему. Когда клиент покупает себе в фирму SAP (миллион Евро между прочим) - ему выдается набор доступных ID-шников под его продукцию. Но продукции бывает больше, чем ID-шников, искать впадлу, а второго миллиона нету, и продавец исключает товары из продажи, присваивая старым ID-шникам новые товары.
Ничего хуже в программировании быть не может, когда ID существует только в рамках какого-то временного интервала. В этом случае он перестает быть внешним ID, создавая десятки связей много-ко-многим и ломая программистам судьбу на ближайший месяц.
Вот так где-то.
ps.
https://docs.google.com/spreadsheets/d/1nxHJiDv6dR...