2013-08-22 39 views
130

Tôi gặp vấn đề với truy vấn của mình trong MySQL. bàn của tôi có 4 cột và có vẻ gì đó như thế này:Làm thế nào để xóa một hàng nhất định khỏi bảng mysql với cùng giá trị cột?

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

id_usersid_product là chìa khóa nước ngoài từ các bảng khác nhau.

Những gì tôi muốn là để xóa chỉ một dòng:

1  2  1 2013 

nào xuất hiện hai lần, vì vậy tôi chỉ muốn xóa nó.

Tôi đã thử truy vấn này:

delete from orders where id_users = 1 and id_product = 2 

Nhưng nó sẽ xóa cả trong số họ (kể từ khi họ được nhân đôi). Bất kỳ gợi ý nào về việc giải quyết vấn đề này?

Trả lời

167

Thêm một limit đến delete truy vấn

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

Việc này chỉ xóa một hàng. Nếu có 3 người dùng này và id sản phẩm thì 2 sẽ vẫn còn. – Rob

+8

Có, OP nói (s) anh ta muốn xóa 1 hàng. Đó là những gì truy vấn của tôi. –

+2

Có, nhưng tôi nghĩ đây không phải là những gì anh ta/cô ấy muốn. – Rob

57

Tất cả các bảng phải có một khóa chính (bao gồm một cột duy nhất hoặc nhiều), lặp lại hàng không có ý nghĩa trong một cơ sở dữ liệu quan hệ. Bạn có thể hạn chế số lượng hàng xóa bằng LIMIT mặc dù:

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

Nhưng đó chỉ là giải quyết vấn đề hiện tại của bạn, bạn chắc chắn nên làm việc về vấn đề lớn hơn bằng cách định nghĩa khóa chính.

+0

Tìm thấy nó, cảm ơn các bạn! – Dani

+1

Điều này là tốt để đề cập đến khóa chính nên là duy nhất trong một databse quan hệ. – Paul

+1

@Paul Đây chính là điều tôi định nói. Nhưng đừng quên khóa duy nhất không cần thiết có nghĩa là khóa chính. –

17

Bạn cần chỉ định số hàng cần xóa. Trong trường hợp của bạn (và tôi giả định rằng bạn chỉ muốn giữ một) điều này có thể được thực hiện như thế này:

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) 
+0

Cảm ơn Rob, nhưng không ... Tôi chỉ muốn xóa một hàng duy nhất, không chỉ giữ một số – Dani

+0

Điều này không hoạt động đối với tôi trong 5.5.40, nó ném một lỗi cú pháp. Như đã đề cập ở đây: http://stackoverflow.com/a/578926/1076075, có vẻ như chúng tôi không thể sử dụng truy vấn phụ để chỉ định giá trị của mệnh đề LIMIT. Đối với bất kỳ ai đang cố gắng thực hiện công cụ theo cách này, hãy kiểm tra điều này: http://stackoverflow.com/q/578867/1076075 –

6

Cách tốt nhất để thiết kế bảng là thêm một hàng tạm thời làm tăng tự động và giữ làm khóa chính. Vì vậy, chúng ta có thể tránh những vấn đề trên.

+1

Hoặc một hàng cố định. Tôi biết đây là một câu hỏi cũ, nhưng tôi mặc dù tôi nên nói nó. Id được sử dụng cho loại tình huống này. Nếu bạn lo lắng về không gian: BIGINT chỉ là 8 byte! –

3

Đã có câu trả lời cho Xóa hàng theo LIMIT. Lý tưởng nhất là bạn nên có khóa chính trong bảng của bạn. Nhưng nếu không có.

tôi sẽ đưa ra cách khác:

  1. Bằng cách tạo Unique index

tôi thấy id_users và id_product phải là duy nhất trong ví dụ của bạn.

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

Điều này sẽ xóa các hàng trùng lặp có cùng dữ liệu.

Nhưng nếu bạn vẫn gặp phải lỗi, ngay cả khi bạn sử dụng bỏ qua khoản, hãy thử này:

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. Bằng cách tạo bảng một lần nữa

Nếu có là nhiều hàng có giá trị trùng lặp, khi đó bạn cũng có thể tạo lại bảng

RENAME TABLE `orders` TO `orders2`; 

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product; 
Các vấn đề liên quan