View Full Version : [SQLite] è possibile creare un trigger che...
Ciao
Vorrei creare un trigger che riordini parzialmente i valori della colonna "n"
(solo se necessario incrementandoli di 1)
per evitare duplicati nella colonna "n"
in caso di aggiornamento o nuovo inserimento
ipotizzando una tabella con due colonne come questa
k = integer primary key
n = integer
k n
--------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
9 9
inviando questa questa query
UPDATE tabella SET n=5 WHERE k=4
poi in trigger dovrebbe modificarla cosi
k n
--------
1 1
2 2
3 3
4 5 <---------update
5 6 <---------trigger n+1
6 7 <---------trigger n+1
7 8 <---------trigger n+1
9 9
Sperando di essere stato chiaro, grazie per gli eventuali consigli :)
Daniels118
30-10-2014, 12:01
Vedi un po' come va... http://sqlfiddle.com/#!7/f7204/1
Ciao
Cosa rappresenta la "t" presente nel trigger?
SELECT 1 FROM tabella t ...
--------------------
ho riscontrato questo inconveniente...
http://sqlfiddle.com/#!7/f7204/8
SELECT * FROM tabella;
UPDATE tabella SET n = 5 WHERE k = 4;
SELECT * FROM tabella;
UPDATE tabella SET n = 5 WHERE k = 7;
SELECT * FROM tabella order by n;
k n
1 1
2 2
3 3
4 5 <--------- questo dovrebbe diventare n+1=6
7 5 < update
5 7
6 8
9 10
e questo …
http://sqlfiddle.com/#!7/f7204/18
UPDATE tabella SET n = 5 WHERE k = 4;
UPDATE tabella SET n = 5 WHERE k = 7;
UPDATE tabella SET n = 8 WHERE k = 1;
SELECT * FROM tabella order by n;
UPDATE tabella SET n = 6 WHERE k = 4;
SELECT * FROM tabella order by n;
k n
2 2
3 3
4 5
7 5
5 7
1 8
6 9
9 10
k n
2 2
3 3
7 5
4 6 < update
5 7
1 9 < dovrebbe restare 8 perche sei non esisteva
6 10 < dovrebbe restare 9
9 11 < dovrebbe restare 10
grazie
bye bye :)
Daniels118
31-10-2014, 14:02
Quando si fanno delle query nidificate che coinvolgono una stessa tabella può essere necessario fare riferimento ai record provenienti dall'una o dall'altra query, per questo bisogna assegnare alla tabella un alias univoco.
In quel caso ho deciso di chiamare la tabella t, ma poteva andar bene un qualunque altro nome.
Ci ragiono un po' e ti faccio sapere.
Daniels118
31-10-2014, 15:20
Fosse MySQL sarebbe stato facile, SQLite è molto carente sulle procedure, forse si potrebbe arrangiare qualcosa con dei trigger ricorsivi, ma andrebbe bene solo per tabelle molto molto piccole a causa del limite di ricorsione, e comunque non ho modo di provarlo (sembra che SQL fiddle non consenta l'attivazione dei trigger ricorsivi). Penso che dovrai implementare l'operazione nella tua applicazione oppure passare ad un db più potente.
grazie
puntroppo non posso cambiare db :(
proverò a trovare una soluzione riducendo al minimo le query
ciao :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.