Newsgroup: it.comp.software.database
Titolo: [mysql] Due campi autoincrement in una tabella

Ciao a tutti
sono greenkey, nuovo le NG e relativamente nella programmazione.
Salvo i convenevoli e porgo subito il quesito.
Ho la necessità di mettere due campi autoincrement nella stessa
tabella.
Esempio:
CREATE TABLE doppioAI (
id int(3) unsigned NOT NULL auto_increment,
class int(3) unsigned NOT NULL auto_increment
);
so che è sbagliato ma è solo per l'esempio
INSERT INTO doubleAI
(id,class) values
(null,null),
(7,null),
(null,15),
(32,42);
quindi:
1. inserisce un record con id=1 e class=1
2. inserisce un record con id=7 e class=2
3. inserisce un record con id=2 e class=15
4. inserisce un record con id=32 e class=42
Ho anche pensato di fare così:
inset into doubleAI
(id,class) values
(null,max(class)+1)
ma non funziona
sapete come risolvere il problema?
Grazie
 >gk<

4. inserisce un record con id=32 e class=42
Questa cosa però non rispecchia il funzionamento di un auto_increment di 
mysql: se dopo 1 tu forzi 7 il prossimo lui lo calcola come 8, non come 2. 
Quindi per come la vedo io per ottenere il comportamento che hai illustra ti 
devi fare una tabella esterna che conserva entrambi gli indici (organizzata 
come meglio credi) e prima di ogni inserimento che necessiti di un valore 
calcolato dovrai:
- Iniziare una transazione.
- Prelevare il/i valore/i dalla tabella degli indici.
- Incrementarlo/i di 1.
- Verificare che non sia/no già presente/i nella tabella di destinazione. Se 
un valore c'è già aumentare di nuovo di 1 e ripetere finché non trovi un 
valore che non è ancora stato usato.
- UPDATE del/i valore/i trovato/i nella tabella degli indici (che quindi 
memorizza sempre gli ultimi valori calcolati)
- COMMIT della transazione.
- Effettui l'INSERT col valore che ti sei calcolato.
IG

 mysql: se dopo 1 tu forzi 7 il prossimo lui lo calcola come 8, non
come 2.
ok, sapevo che mi sarei spiegato male...
in realtà mi interessa che la chiave sia univoca, in particolare:
- id è primaria e deve essere SEMPRE univoca
- class può essere ripetuta ma deve esserci un sistema che inserisca
automaticamente un valore nuovo, solo nel caso non venga specificato
spero di essermi spiegato meglio

spero di essermi spiegato meglio
Il procedimento esposto grarantisce univocità su entrambi i valori. In ogni 
caso non puoi cavartela in una sola istruzione, una cosa del tipo:
INSERT INTO doubleIA (class) VALUES ((SELECT MAX(class)+1 FROM doubleIA));
non è accettata da Mysql, che rifiuta subquery di selezione sulla stessa 
tabella sulla quale stai inserendo, aggionrando o cancellando. Procedi 
quindi spezzandola in due e, sulla stessa connessione, dai la seguente 
sequenza:
SET AUTOCOMMIT=0;
START TRANSACTION;
SELECT @ProssimoClass:=MAX(Class)+1 FROM DoubleIA;
INSERT INTO doubleIA (class) VALUES (@ProssimoClass);
COMMIT;
SET AUTOCOMMIT=1;
Aggiungendo eventualmente anche ID nella insert se devi specificarne il 
valore. Perché funzioni entrambe le tabelle coinvolte devono supportare le 
transazioni (
p.es
. InnoDB). La transazione grantisce che se due istanze 
stanno generando un valore questo sia diverso.
IG

 INSERT INTO doubleIA (class) VALUES (@ProssimoClass);
....e se c'è un inserimento concorrente che succede? non è che ti 
ritrovi 2 valori uguali?
Nel problema esposto si sente la mancanza di strutture come le sequenze 
di postgresql. Una rozza soluzione potrebbe essere quella di crearti una 
tabella apposita in cui metti un campo autoincrementale. Questa tabella 
la potresti utilizzare a mo di sequenza: inserisci un record e prelevi 
il last insert id da utilizzare.
Ciao
Gianni

 2 valori uguali?
Mhh.... quel START TRANSACTION;  .... ; COMMIT; ?
IG.