[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
그러나 두 항목이 모두 삭제되므로 둘 다 삭제됩니다. 이 문제를 해결하기위한 힌트가 있습니까?
답변
답변
모든 테이블에는 기본 키 (단일 또는 여러 열로 구성됨)가 있어야하며, 중복 행은 관계형 데이터베이스에서 의미가 없습니다. 다음을 사용하여 삭제 행 수를 제한 할 수 있습니다 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
. 이상적으로는 테이블에 기본 키가 있어야합니다. 그러나 그렇지 않다면.
나는 다른 방법을 줄 것이다 :
- 고유 색인 을 작성하여
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;
- 테이블을 다시 작성하여
중복 값을 가진 행이 여러 개인 경우 테이블을 다시 만들 수도 있습니다.
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가 있습니다 …