Вставка Mysql, если повторяющееся значение уникального ключа, вставьте другое значение

Возможно ли при вставке строки с уникальным полем изменить значение, которое входит в уникальное поле, на другое в случае дублирования?

Ситуация: пользователь добавляет новую статью, название которой не может повторяться. По какой-то причине пользователь вводит имя, которое уже существует в базе данных.

Если использовать "ОБНОВЛЕНИЕ ДУБЛИЧНОГО КЛЮЧА" - предыдущая запись (с тем же именем, что и вставленное) получает все новые данные в других полях (происходит обновление) - нехорошо.

Что требуется, так это при вставке, если поле уникально и есть совпадение в БД, измените вставляемое значение на что-то вроде «[DUPLICATE] name».

Это выявит наличие дубликата, и пользователь просто изменит имя (которое, скорее всего, было вставлено как дубликат по ошибке).


person bbe    schedule 16.08.2016    source источник
comment
Попробуйте вставку. Если это не удается, измените уникальное значение и нажмите его снова.   -  person tadman    schedule 16.08.2016
comment
Есть ли способ включить посредника (выбрать..., где имя = имя статьи) в оператор вставки, чтобы выбор давал либо истину (т.е. объединение имени с [дублирующейся] строкой), либо ложь (имя вставляется как есть)?   -  person bbe    schedule 17.08.2016
comment
INSERT INTO ... SELECT ... FROM это вещь, так может быть?   -  person tadman    schedule 17.08.2016
comment
INSERT INTO и SELECT невозможны из-за ограничения mysql (документы mysql: вы не можете вставлять в таблицу и выбирать из той же таблицы в подзапросе). Рабочее решение на данный момент: - перебрать все имена полей, которые уникальны (заранее известны); - если дубликат присутствует в БД (т.е. count !=zero) - добавить отметку времени к значению, которое нужно вставить/обновить. Вместо постоянного значения используется измененная форма временной метки, чтобы избежать создания еще одного дубликата, имя которого (например, «имя[dub]») уже присутствует в БД из предыдущего добавления/редактирования.   -  person bbe    schedule 18.08.2016


Ответы (1)


Вы должны сделать что-то вроде (используя подготовленные операторы с mysqli) -

 SELECT name FROM table WHERE name=?

Привяжите переменную (я предполагаю, что $articleName) и сохраните результат, затем проверьте, есть ли совпадение с mysqli_num_rows().

Если существует одна или несколько строк, переименуйте название статьи.

 $articleName=$articleName."[DUPLICATE]";

Затем вставьте в БД.

Примечание. Обычно не бывает одинаковых названий артиклей, потому что предложение может быть построено разными способами. Рассмотрите возможность создания очень умной программы для обнаружения этого или проверки вручную, как это делается в SO.

person twodee    schedule 16.08.2016