stai facendo confusione, se tu guardi il codice generato della pagina( tasto destro-> vedi html/sorgente) vedrai che tutti gli input hanno lo stesso id, questo crea problemi al tuo script in quanto il metodo getElementById o l'equivalente jquery $('#id') recupera solo il primo elemento con quell'id. Detto questo puoi anche fregartene e fare riferimeno alla classe invece che all'id, diversamente dall'id la classe puo anche essere ripetuta su più elementi html. Ecco come lo farei io:

codice:
<? 
// Connessione
$q=mysql("$NOME_DBASE","SELECT * FROM tabella order by ID") or die(mysql_error());
    while ($row  =  mysql_fetch_row($q)) {
   $ID=$row['0'];
   $QUANTITA=$row['1'];
?>
  <input name="quantita" type="text" value="<? echo  $QUANTITA;?>" size="3" maxlength="5" class="button2">
<? } ?>

<script>
$(".button2").change(function(){
            $('#loader').show();
            var QQ=$(this).val();
            var IDRIGO='<? echo $ID; ?>';
                    
                        //ESECUZIONE DELLA CHIAMATA AJAX
            $.ajax(
                {
                    type: 'POST',
                    url: '<? echo "insert.php"; ?>',
                    data: {QQ:QQ, N:IDRIGO},
                    success: function(data){
                        if(data.error==1){
                            alert("Errore");
                        }else{
                            alert("Registrazione ok "+IDRIGO);
                        }
                        $('#loader').hide();
                        $('#invia').attr('disabled',false);
                    },
                    complete: function(data){},
                    failure: function(data){
                        alert("Errore nella chiamata ajax");
                        $('#loader').hide();
                        $('#invia').attr('disabled',false);
                    }
            });
});
<script>