동일한 열 값을 가진 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

a를 limit받는 삭제 쿼리

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

3
이것은 하나의 행만 삭제합니다. 이 사용자와 제품 ID가 3 개인 경우 2가 남아 있습니다.
Rob

10
예, OP는 1 행을 삭제하고 싶다고 말합니다. 그것이 내 쿼리가하는 일입니다.
juergen d

2
네,하지만 이것이 그가 원하는 것이 아니라고 생각합니다.
Rob

3
Juergen 감사합니다. 이것이 내가 필요한 전부입니다!
Dani

3
OP가 실제로해야 할 일은 먼저 어떤 행이 복제되는지 확인한 다음 중복을 삭제하는 것입니다.
wbinky 2016 년

64

모든 테이블에는 기본 키 (단일 또는 여러 열로 구성됨)가 있어야하며, 중복 행은 관계형 데이터베이스에서 의미가 없습니다. 다음을 사용하여 삭제 행 수를 제한 할 수 있습니다 LIMIT.

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

그러나 현재 문제를 해결하기 위해 기본 키를 정의하여 더 큰 문제를 해결해야합니다.


1
기본 키는 관계형 데이터베이스에서 고유해야한다는 점을 언급하는 것이 좋습니다.
Paul

1
@Paul 이것은 정확히 내가 말하려는 것입니다. 그러나 고유 키는 반드시 기본 키를 의미하지는 않습니다.
Ryan Fung

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)

고마워 Rob, 아니 ... 난 그냥 한 행을 삭제하고 싶지만 한 행을 유지하고 싶지 않습니다
Dani

이것은 5.5.40에서 작동하지 않으며 구문 오류가 발생합니다. 여기에 언급 된대로 stackoverflow.com/a/578926/1076075 , LIMIT 절의 값을 지정하기 위해 하위 쿼리를 사용할 수없는 것 같습니다. : 물건이 방법을하려고 누군가를 위해,이 체크 아웃 stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju

8

테이블을 디자인하는 가장 좋은 방법은 하나의 임시 행을 자동 증분으로 추가하고 기본 키로 유지하는 것입니다. 따라서 위와 같은 문제를 피할 수 있습니다.


1
또는 영구적 인 행. 나는 이것이 오래된 질문이라는 것을 알고 있지만, 나는 그것을 말해야합니다. 이러한 종류의 상황에는 ID가 사용됩니다. 공간이 걱정되는 경우 : BIGINT는 8 바이트에 불과합니다!
Ismael Miguel

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를 추가 한 후 ID로 행을 삭제할 수 있습니다. 따라서 테이블에는 각 행과 id_user, id_product ecc에 대한 고유 ID가 있습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.