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

153

У меня проблема с моими запросами в 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

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

Дани
источник

Ответы:

208

Добавить limitв запрос на удаление

delete from orders 
where id_users = 1 and id_product = 2
limit 1
Юрген д
источник
3
Это удаляет только одну строку. Если бы было 3 с этим пользователем и идентификатором продукта, то 2 осталось бы.
Роб
10
Да, OP говорят, что он хочет удалить 1 строку. Это то, что делает мой запрос.
Юрген д
2
Да, но я думаю, что это не то, что он / она хочет.
Роб
3
Спасибо Юрген. Это все что мне нужно!
Дани
3
Что OP действительно нужно сделать, это проверить сначала, какие строки дублируются, а затем удалить дубликаты.
wbinky
64

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

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

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

DNET
источник
1
Хорошо отметить, что первичный ключ должен быть уникальным в реляционной базе данных.
Пол
1
@Paul Это именно то, что я собираюсь сказать. Но не забывайте, что уникальный ключ не обязательно означает первичный ключ.
Райан Фунг
20

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

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)
обкрадывать
источник
Спасибо, Роб, но нет ... Я просто хочу удалить одну строку, а не оставить одну
Дани
Это не работает для меня в 5.5.40, он выдает синтаксическую ошибку. Как упомянуто здесь: stackoverflow.com/a/578926/1076075 , кажется, что мы не можем использовать подзапрос, чтобы указать значение предложения LIMIT. Если вы пытаетесь делать что-то таким образом, проверьте это: stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju
8

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

praveenraj4ever
источник
1
Или постоянный ряд. Я знаю, что это старый вопрос, но я должен сказать это. Идентификаторы используются для такой ситуации. Если вы беспокоитесь о пространстве: BIGINT занимает всего 8 байтов!
Исмаэль Мигель
5

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

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

  1. Создав уникальный индекс

Я вижу, что 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;
Сомнат Мулук
источник
1

Вы должны добавить идентификатор, который автоматически увеличивается для каждой строки, после этого вы можете удалить строку по ее идентификатору. так что ваша таблица будет иметь уникальный идентификатор для каждой строки и id_user, id_product ecc ...

Андрей Торнеа
источник