Bagaimana cara menghapus baris tertentu dari tabel mysql dengan nilai kolom yang sama?


153

Saya punya masalah dengan pertanyaan saya di MySQL. Tabel saya memiliki 4 kolom dan terlihat seperti ini:

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

id_usersdan id_productkunci asing dari tabel yang berbeda.

Yang saya inginkan adalah menghapus hanya satu baris:

1     2     1    2013

Yang muncul dua kali, jadi saya hanya ingin menghapusnya.

Saya sudah mencoba pertanyaan ini:

delete from orders where id_users = 1 and id_product = 2

Tapi itu akan menghapus keduanya (karena mereka digandakan). Adakah petunjuk untuk menyelesaikan masalah ini?

Jawaban:


208

Tambahkan limitke permintaan hapus

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

3
Ini hanya menghapus satu baris. Jika ada 3 dengan id pengguna dan produk ini maka 2 akan tetap.
Rob

10
Ya, OP mengatakan dia ingin menghapus 1 baris. Itulah yang dilakukan kueri saya.
juergen d

2
Ya, tapi saya pikir ini bukan yang dia inginkan.
Rob

3
Juergen terima kasih. Ini yang saya butuhkan!
Dani

3
Apa yang benar-benar perlu OP lakukan adalah memeriksa terlebih dahulu baris apa yang diduplikasi kemudian menghapus duplikatnya.
wbinky

64

Semua tabel harus memiliki kunci utama (terdiri dari satu atau beberapa kolom), baris duplikat tidak masuk akal dalam database relasional. Anda dapat membatasi jumlah baris yang dihapus menggunakan LIMIT:

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

Tapi itu hanya menyelesaikan masalah Anda saat ini, Anda pasti harus bekerja pada masalah yang lebih besar dengan mendefinisikan kunci utama.


1
Ini bagus untuk menyebutkan bahwa kunci utama harus unik dalam data relasional.
Paul

1
@ Paul Inilah yang akan saya katakan. Tapi jangan lupa kunci unik tidak perlu berarti kunci primer.
Ryan Fung

20

Anda harus menentukan jumlah baris yang harus dihapus. Dalam kasus Anda (dan saya berasumsi bahwa Anda hanya ingin menyimpannya) ini dapat dilakukan seperti ini:

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)

Terima kasih Rob, tapi tidak ... Saya hanya ingin menghapus satu baris, bukan hanya satu
Dani

Ini tidak berfungsi untuk saya di 5.5.40, ini melempar kesalahan sintaksis. Seperti disebutkan di sini: stackoverflow.com/a/578926/1076075 , sepertinya kita tidak bisa menggunakan subquery untuk menentukan nilai klausa LIMIT. Bagi siapa pun yang mencoba melakukan hal-hal seperti ini, lihat ini: stackoverflow.com/q/578867/1076075
Bharadwaj Srigiriraju

8

Cara terbaik untuk mendesain tabel adalah menambahkan satu baris sementara sebagai kenaikan otomatis dan simpan sebagai kunci utama. Jadi kita bisa menghindari masalah di atas.


1
Atau baris permanen. Saya tahu ini adalah pertanyaan lama, tetapi saya harus mengatakannya. Id digunakan untuk situasi seperti ini. Jika Anda khawatir tentang ruang: A BIGINT hanya 8 byte!
Ismael Miguel

5

Sudah ada jawaban untuk Menghapus baris demi baris LIMIT. Idealnya Anda harus memiliki kunci utama di meja Anda. Tetapi jika tidak ada.

Saya akan memberikan cara lain:

  1. Dengan membuat indeks unik

Saya melihat id_users dan id_product harus unik dalam contoh Anda.

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

Ini akan menghapus baris duplikat dengan data yang sama.

Tetapi jika Anda masih mendapatkan kesalahan, bahkan jika Anda menggunakan klausa IGNORE, coba ini:

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. Dengan membuat tabel lagi

Jika ada beberapa baris yang memiliki nilai duplikat, maka Anda juga bisa membuat ulang tabel

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

1

Anda harus menambahkan id yang bertambah secara otomatis untuk setiap baris, setelah itu Anda dapat menghapus baris dengan idnya. jadi meja Anda akan memiliki id unik untuk setiap baris dan id_user, id_product ecc ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.