Bir döngünün önerisi, bir prosedür tipi çözüm talebini ifade ettiğinden. İşte benim.
Bir tablodan alınan herhangi bir tek kayıt üzerinde çalışan herhangi bir sorgu, bir tablonun her satırında aşağıdaki gibi çalışmasını sağlamak için bir prosedüre sarılabilir:
DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
O zaman işte örneğinize göre prosedür (netlik için kullanılan tablo_A ve tablo_B)
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;
;;
O zaman sınırlayıcıyı sıfırlamayı unutma
DELIMITER ;
Ve yeni prosedürü çalıştırın
CALL ROWPERROW();
Örnek talebinizden kopyaladığım "INSERT INTO" satırında istediğinizi yapabilirsiniz.
DİKKATLİCE, burada kullanılan "INSERT INTO" satırının sorudaki satırı yansıttığına dikkat edin. Bu cevaba verilen yorumlara göre, çalıştırdığınız SQL sürümü için sorgunuzun sözdizimsel olarak doğru olduğundan emin olmanız gerekir.
Kimlik alanınızın artırıldığı ve 1'den başladığı basit durumda, örnekteki satır şöyle olabilir:
INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;
"SEÇ SAYISI" satırının yerine
SET n=10;
Sorgunuzu yalnızca table_A'daki ilk 10 kayıtta test etmenize izin verir.
Son bir şey. Bu işlemin farklı tablolara yerleştirilmesi de çok kolaydır ve üst tablonun her satırından yeni bir tabloya dinamik olarak farklı sayıda kayıt ekleyen bir tablo üzerinde bir işlem gerçekleştirebilmemin tek yoluydu.
Daha hızlı çalışmasına ihtiyacınız varsa, o zaman bunu temel almaya çalışın, eğer değilse, o zaman sorun değil. Yukarıdakileri imleç biçiminde de yeniden yazabilirsiniz, ancak performansı iyileştirmeyebilir. Örneğin:
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;
;;
Kullanacağınız değişkenleri sorgulanan tablolardakilerle aynı tipte tanımlamayı unutmayın.
Benim tavsiyem, yapabildiğiniz zaman set tabanlı sorgularla gitmek ve gerekirse yalnızca basit döngüleri veya imleçleri kullanmaktır.