hai ragione non mi ero accorto della variabile $id nel js, cmq come hai fatto non è coretto perche se inserisci lo script dentro il ciclo quest'ultimo viene ripetuto piu volte. Una soluzione migliore potrebbe essere questa:

codice:
<? 
// Connessione
$q=mysql("$NOME_DBASE","SELECT * FROM tabella order by ID")ordie(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" id="<? echo $ID; ?>"><?}?>

<script>
$(".button2").change(function(){
            $('#loader').show();
            var QQ=$(this).val();
            var IDRIGO=$(this).prop("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>