Mysql
 sql >> Database >  >> RDS >> Mysql

Ciclo n volte senza utilizzare una procedura memorizzata

Documenti MySQL su Dichiarazioni di controllo del flusso dì:

Documenti su Programmi e visualizzazioni memorizzati dì:

Sintassi dell'istruzione composta

Quindi, sembra che tu possa eseguire un ciclo esplicito solo all'interno di una procedura, una funzione o un trigger memorizzati.

A seconda di ciò che fai nella tua istruzione SQL, potrebbe essere accettabile utilizzare una tabella (o vista) di numeri (Creazione di una "Tabella dei numeri" in mysql , MYSQL:tabella dei numeri sequenziali ).

Se la tua richiesta è un SELECT ed è OK restituire il risultato del tuo SELECT 10 volte più lungo di un set di risultati (invece di 10 set di risultati separati) puoi fare qualcosa del genere:

SELECT MainQuery.*
FROM
    (
        SELECT 1 AS Number 
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9
        UNION ALL SELECT 10
    ) AS Numbers
    CROSS JOIN
    (
        SELECT 'some data' AS Result
    ) AS MainQuery

Esempio per INSERT

Raccomando di avere una tabella di numeri permanente nel database. È utile in molti casi. Vedi i link sopra come generarlo.

Quindi, se hai una tabella Numbers con int colonna Number con valori da 1 a, diciamo, 100K (come faccio io) e chiave primaria su questa colonna, quindi invece di questo ciclo:

DECLARE count INT DEFAULT 0;
WHILE count < 10 DO
    INSERT INTO table_name(col1,col2,col3) 
    VALUES("val1","val2",count);

    SET count = count + 1;
END WHILE;

puoi scrivere:

INSERT INTO table_name(col1,col2,col3)
SELECT ("val1", "val2", Numbers.Number-1)
FROM Numbers
WHERE Numbers.Number <= 10;

Funzionerebbe anche quasi 10 volte più velocemente.