MySQL вставляет дубликат ключа; Удалить?

Есть ли способ удалить запись о дублирующемся ключе в MySQL?

Скажем, у нас есть запись в базе данных с определенным первичным ключом, и мы пытаемся добавить еще одну с тем же ключом - ON DUPLICATE KEY UPDATE просто обновит запись, но есть ли возможность удалить запись, если она уже существует? Это для простой функциональности входа / выхода одним нажатием кнопки.


person Spencer Mark    schedule 15.07.2012    source источник
comment
Спасибо, думаю, это единственный вариант.   -  person Spencer Mark    schedule 08.04.2013


Ответы (5)


Это обходной путь, но он работает:

Создайте новый столбец и назовите его do_delete или как-то так, сделав его крошечным-int. Затем сделайте On Duplicate Key Update do_delete = 1;

В зависимости от вашей версии/подключения MySQL вы можете выполнять несколько запросов в одном операторе. Однако, если нет, просто запустите отдельный запрос сразу после слов. В любом случае, следующий запрос будет просто: Delete From [table] Where do_delete = 1;. Таким образом, если это новая запись, она ничего не удалит. Если это не новая запись, она будет помечена для удаления, после чего вы сможете ее удалить.

person James    schedule 09.01.2015
comment
Мне нравится этот вариант, и мне не нужно будет менять свое заявление об обновлении. - person ChiMo; 06.07.2016
comment
Гениальное решение! Спасибо - person Mad Dog Tannen; 16.01.2019

Используйте REPLACE INTO:

replace into some_table
select somecolumn from othertable

либо вставит новые данные, либо, если такие же данные существуют, удалит данные и вставит новые

person juergen d    schedule 15.07.2012
comment
Производительность замены на ON DUPLICATE UPDATE отличается. REPLACE INTO не обновляет запись - она ​​удаляет запись и добавляет ее снова, если у вас задействованы тонны данных и индексов, это может занять некоторое время ... лучше использовать ON DUPLICATE UPDATE, но он просит УДАЛИТЬ что-то вроде ON ДУБЛИКАЦИЯ УДАЛИТЬ - person Ricky Levi; 27.08.2013

Ближайшим возможным решением для этого является оператор REPLACE. Вот документация по REPLACE.

Аналогичный вопрос был задан на форумах MySQL и < href="http://forums.mysql.com/read.php?10,203800,203975#msg-203975" rel="nofollow">рекомендуемый (и единственный) ответ заключался в использовании REPLACE.

person hjpotter92    schedule 15.07.2012
comment
Да, но это не совсем то, что я ищу - я не хочу заменять элемент в базе данных - если он существует, я хочу избавиться от него всего вместе. - person Spencer Mark; 15.07.2012
comment
Я предполагаю, что единственным вариантом (если вышеизложенное является единственным возможным решением) в этом случае будет запуск отдельных операторов - сначала проверить, найдена ли запись, а затем на основе результата либо добавить ее, либо удалить. - person Spencer Mark; 15.07.2012
comment
или создайте столбец BOOLEAN или ENUM и установите для него значение 0 или 1, в зависимости от того, хотите вы этого или нет. - person hjpotter92; 16.07.2012

чтобы быть более понятным с mySql:
значения могут быть из одной таблицы:
replace into table1 (column1,column2) select (val1,val2) from table1

или

значения могут быть из другой таблицы:
replace into table1 (column1,column2) select (val1,val2) from table2

>или

значения могут быть из любой таблицы с условием:
replace into table1 (column1,column2) select (val1,val2) from table1 where <br>column3=val3 and column4=val4 ...


или

также помните, что значения могут быть статическими с именем таблицы для тезки:< бр> replace into table1 (column1,column2) select (123,"xyz") from table1

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

и

если у вас есть столбец с типом данных TIMESTAMP с при обновлении CURRENT_TIMESTAMP, это не будет иметь никакого эффекта;

person sifr_dot_in    schedule 25.02.2021

Да, конечно, в MySQL есть решения для вашей проблемы.

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

insert ignore into mytbl(id,name) values(6,'ron'),(7,'son');

Здесь столбец id является первичным ключом в таблице mytbl. Это добавит несколько значений в таблицу, удалив или пропустив новые повторяющиеся записи.

Надеюсь, это удовлетворит ваше требование.

person Abhik Dey    schedule 02.12.2013
comment
вставить игнорировать ничего не удаляет - person serge.k; 25.09.2015