Как удалить определенную строку из таблицы mysql с одинаковыми значениями столбцов?

У меня проблема с моими запросами в MySQL. Моя таблица имеет 4 столбца и выглядит примерно так:

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_users и id_product - это внешние ключи из разных таблиц.

Я хочу удалить только одну строку:

1     2     1    2013

Что появляется дважды, поэтому я просто хочу его удалить.

Я пробовал этот запрос:

delete from orders where id_users = 1 and id_product = 2

Но он удалит оба из них (поскольку они дублируются). Любые намеки на решение этой проблемы?

Ответ 1

Добавьте limit в delete запрос

delete from orders 
where id_users = 1 and id_product = 2
limit 1

Ответ 2

Все таблицы должны иметь первичный ключ (состоящий из одного или нескольких столбцов), повторяющиеся строки не имеют смысла в реляционной базе данных. Вы можете ограничить количество строк с помощью LIMIT, хотя:

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

Но это просто решает вашу текущую проблему, вы должны определенно работать над большей проблемой, определяя первичные ключи.

Ответ 3

Вам нужно указать количество строк, которые необходимо удалить. В вашем случае (и я предполагаю, что вы только хотите его сохранить) это можно сделать следующим образом:

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

Ответ 4

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

Ответ 5

Уже есть ответы на удаление строки на LIMIT. В идеале у вас должен быть первичный ключ в вашей таблице. Но если нет.

Я дам другие способы:

Я вижу, что id_users и id_product должны быть уникальными в вашем примере.

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

Они будут удалять повторяющиеся строки с одинаковыми данными.

Но если вы все еще получаете сообщение об ошибке, даже если вы используете предложение IGNORE, попробуйте следующее:

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. Снова создав таблицу

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

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;