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

그러나 두 항목이 모두 삭제되므로 둘 다 삭제됩니다. 이 문제를 해결하기위한 힌트가 있습니까?



답변

a를 limit받는 삭제 쿼리

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


답변

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

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

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


답변

삭제해야하는 행 수를 지정해야합니다. 귀하의 경우 (그리고 나는 당신이 하나만 유지하고 싶다고 가정합니다) 이것은 다음과 같이 수행 될 수 있습니다 :

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)


답변

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


답변

행별 삭제에 대한 답변이 이미 있습니다 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;


답변

각 행에 대해 자동 증가하는 ID를 추가 한 후 ID로 행을 삭제할 수 있습니다. 따라서 테이블에는 각 행과 id_user, id_product ecc에 대한 고유 ID가 있습니다 …


답변