Saya memiliki tabel dengan dua kolom: id (kunci unik) dan data.

Saya perlu menghapus baris dari tabel itu dengan id sama dengan beberapa nilai. Permintaan yang jelas:

DELETE FROM table WHERE id = value

Namun, saya perlu mencegah tabel menjadi kosong (yaitu tanpa baris). Dengan kata lain, saya perlu menghapus baris dengan id = value hanya jika tabel tidak menjadi kosong setelah penghapusan tersebut.

Saya perlu melakukannya secara atom dalam satu kueri, saya juga perlu tahu dari hasil kueri ini apakah ada sesuatu yang benar-benar dihapus atau tidak.

Apa itu mungkin?

Terima kasih.

2
Roman 14 Januari 2021, 20:52

3 jawaban

Jawaban Terbaik

Sepertinya yang ini berfungsi:

START TRANSACTION;
DELETE FROM table WHERE id = ... AND (SELECT * FROM (SELECT COUNT(*) FROM table) Temp) > 1;
SELECT ROW_COUNT();

Bagaimanapun, mungkin berguna bagi seseorang.

0
Roman 14 Januari 2021, 18:14

Anda dapat menggunakan gabungan sederhana untuk ini:

DELETE tbl.* 
FROM tbl 
JOIN tbl tbl1 ON tbl.id <> tbl1.id WHERE tbl.id = 1; 

Dalam hal ini record yang dihapus hanya ada satu record lagi dengan id yang berbeda

Coba SQL di sandbox

1
Slava Rozhnev 14 Januari 2021, 18:30

Atau, seseorang dapat menggunakan rutinitas yang tersimpan.

CREATE PROCEDURE delete_keep_one(pID INT)
BEGIN
   DECLARE cnt INT;
   START TRANSACTION;
   DELETE FROM t1 WHERE id = pID;
   SELECT COUNT(*) INTO cnt FROM t1;
   IF cnt = 0 THEN
       ROLLBACK;
   ELSE
       COMMIT;
   end if;
END;


CALL delete_keep_one(200);

Jadi COMMIT hanya akan terjadi ketika COUNT(*) kembali lebih besar dari 0.

Jika Anda memerlukan CALL dalam transaksi lain, Anda mengeluarkan COMMIT dan atau menambahkan parameter yang dapat dikomit secara opsional.

0
geertjanvdk 14 Januari 2021, 18:26