Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya bisa mengulang semua baris tabel? (MySQL)

Karena saran loop menyiratkan permintaan untuk solusi tipe prosedur. Ini milikku.

Kueri apa pun yang berfungsi pada setiap catatan tunggal yang diambil dari tabel dapat dibungkus dalam prosedur untuk membuatnya dijalankan melalui setiap baris tabel seperti:

Pertama-tama hapus prosedur yang ada dengan nama yang sama, dan ubah pembatas sehingga SQL Anda tidak mencoba menjalankan setiap baris saat Anda mencoba menulis prosedur.

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;

Maka inilah prosedur sesuai contoh Anda (table_A dan table_B digunakan untuk kejelasan)

CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO 
  INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
  SET i = i + 1;
END WHILE;
End;
;;

Kemudian jangan lupa untuk mengatur ulang pembatas

DELIMITER ;

Dan jalankan prosedur baru

CALL ROWPERROW();

Anda dapat melakukan apapun yang Anda suka di baris "INSERT INTO" yang saya salin dari contoh permintaan Anda.

Perhatikan HATI-HATI bahwa baris "INSERT INTO" yang digunakan di sini mencerminkan baris dalam pertanyaan. Sesuai dengan komentar untuk jawaban ini, Anda perlu memastikan bahwa kueri Anda secara sintaksis benar untuk versi SQL mana pun yang Anda jalankan.

Dalam kasus sederhana di mana bidang ID Anda bertambah dan dimulai dari 1 baris dalam contoh dapat menjadi:

INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;

Mengganti baris "SELECT COUNT" dengan

SET n=10;

Akan membiarkan Anda menguji kueri Anda pada 10 catatan pertama di table_A saja.

Satu hal terakhir. Proses ini juga sangat mudah untuk bersarang di tabel yang berbeda dan merupakan satu-satunya cara saya dapat melakukan proses pada satu tabel yang secara dinamis memasukkan jumlah record yang berbeda ke dalam tabel baru dari setiap baris tabel induk.

Jika Anda membutuhkannya untuk berjalan lebih cepat maka cobalah untuk membuatnya berdasarkan set, jika tidak maka ini baik-baik saja. Anda juga dapat menulis ulang di atas dalam bentuk kursor tetapi mungkin tidak meningkatkan kinerja. misalnya:

DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;

CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
  DECLARE cursor_ID INT;
  DECLARE cursor_VAL VARCHAR;
  DECLARE done INT DEFAULT FALSE;
  DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO cursor_ID, cursor_VAL;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
  END LOOP;
  CLOSE cursor_i;
END;
;;

Ingatlah untuk mendeklarasikan variabel yang akan Anda gunakan sebagai tipe yang sama dengan variabel dari tabel yang ditanyakan.

Saran saya adalah menggunakan kueri berbasis set jika Anda bisa, dan hanya menggunakan loop atau kursor sederhana jika perlu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemisahan string MySQL

  2. Cara Mengatur Kumpulan Karakter dan Susunan Kolom di MySQL

  3. MySQL db tanda tanya bukannya karakter ibrani..?

  4. SQL Query Untuk Menghapus Tabel Di MySQL

  5. Cara Memanggil Prosedur Tersimpan MySQL Dengan Python