Consiglio su inserimento mysql

  • Creatore Discussione Creatore Discussione Kelly
  • Data di inizio Data di inizio

Kelly

Utente Attivo
5 Set 2008
112
1
18
Grazie in anticipo.
Ho bisogno di una mano per l'inserimento di record in mysql.

Caratteristiche della tabella:

L' indice primario della tabella è un contatore automatico.
Nella tabella tutti clienti inseriscono le varie righe dell'ordine.
Per l'inserimento delle righe dell'ordine ho pensato di creare un indice univoco formato dai seguenti campi (codcliente, codzona e idrigaordine) dove i campi codcliente e codzona nella fase di inserimento righe avranno lo stesso valore per ciascun cliente e cio che distingue ogni rigaordine dall'tra è il campo idrigaordine che incremento manualmente.
il codice è questo: gli indici li ho impostati direttamente nella tabella.
Codice:
//di seguito prendo il valore piu alto del campo idrigaordine e poi lo incremento per il prossimo inserimento

$querymax = "SELECT *,MAX(INDICEART) as idrigaordine FROM insart WHERE (codcliente= '$codcli'             AND                 codzona = '$coddest')";
	  $resultindice =mysqli_query($connessione,$querymax) or die (mysqli_error($connessione));
	  $row = mysqli_fetch_array($resultindice);
             //questo è il contatore che incremento
	  $ID_RIGA_ORD=($row[idrigaordine ]+1);
	
//ora inserisco le righe dell'ordine di un determinato cliente.
$query = "INSERT INTO insart (codcliente,codzona ,idrigaordine,CODART,DESCRIZIONE)VALUES('$codcliente,'$codzona ,'$idrigaordine,'$CODART,'$DESCRIZIONE')";
$resultriga = mysqli_query($connessione,$query);
if(!$resultriga)
     die(mysqli_error($connessione));

mysqli_close;
// faccio il close una volta sola giusto?

Non so se il codice è corretto, forse manca qualcosa, ad ogni modo il problema che mi sono posta è che se due persone con lo stesso codcliente e codzona inseriscono un ordine nello stesso preciso momento, so che magari è insolito ma se succede io potrei generare dei valori duplicati per il campo idrigaordine, causando una serie di errori a catena, nel database e nella lettura dell 'ordine...come posso evitarlo?

grazie per tutte le eventuali dritte.
grata. :love:
 
Il campo idrigaordine è quello che la tabella incrementa automaticamente ?

Se si, dovresti essere stata obbligata a porla come chiave primaria: una chiave primaria non ammette record duplicati in una tabella. Inoltre puoi stare tranquilla, mysql sa come gestire le richieste concorrenti e incrementerà opportunamente gli id evitando duplicati. (In questo caso dovresti omettere la dichiarazione del campo dalla query, altrimenti mysql non effettuerà l'auto_increment ma prenderà il valore che tu gli suggerisci)

Se no, dovresti impostare una chiave unica sul campo e dovresti usare una transazione mysql per chiedere un lock temporaneo della tabella e scrivere le righe relative agli ordini.
 
Ciao e grazie

il campo contatore automatico della tabella si chiama ID, quello manuale si chiama appunto idrigaordine
Ma stavo proprio pensando che mi sto complicando la vita.....perchè non utilizzare direttamente il campo id contatore per le righe ordine? anche se non è sequanziale che mi importa tanto posso raggruppare le righe ordini appartenenenti a un ordine anche grazie ai campi codicecliente e codice zona....giusto?
così evito il lock...o sbaglio?



Il campo idrigaordine è quello che la tabella incrementa automaticamente ?

Se si, dovresti essere stata obbligata a porla come chiave primaria: una chiave primaria non ammette record duplicati in una tabella. Inoltre puoi stare tranquilla, mysql sa come gestire le richieste concorrenti e incrementerà opportunamente gli id evitando duplicati. (In questo caso dovresti omettere la dichiarazione del campo dalla query, altrimenti mysql non effettuerà l'auto_increment ma prenderà il valore che tu gli suggerisci)

Se no, dovresti impostare una chiave unica sul campo e dovresti usare una transazione mysql per chiedere un lock temporaneo della tabella e scrivere le righe relative agli ordini.
 
Ciao e grazie
il campo contatore automatico della tabella si chiama ID, quello manuale si chiama appunto idrigaordine
Ok

Ma stavo proprio pensando che mi sto complicando la vita.....perchè non utilizzare direttamente il campo id contatore per le righe ordine?

Esattamente, come ti ho scritto utilizzare la colonna incrementata automaticamente da mysql ti risolve un sacco di problemi.

tanto posso raggruppare le righe ordini appartenenenti a un ordine anche grazie ai campi codicecliente e codice zona....giusto?
così evito il lock...o sbaglio?

Tutto giusto :)
 

Discussioni simili