Newsgroup: it.comp.www.php
Titolo: SQLITE codice univoco

C'entra con il php perchè non sapendolo fare mi tocca scrivere molto 
più codice di controllo che gestire un errore in php!!!
 
Il mio problema è costruire con SQlite un codice univoco.
 
CREATE TABLE t_test(
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 name VARCHAR(10)
 );
 
Funziona bene con un insert MA
1 pippo
2 pluto
3 paperino
 
Cancello 2 pluto e aggiungo nonna papera
1 pippo
3 paperino
4 nonna papera
 
MA se per una sciaguratissima ipotesi
INSERT INTO t_test(id,name) VALUES (2,'Gambadilegno');
 
Ottengo
1 pippo
2 Gambadilegno
3 paperino
4 nonna papera
 
mi riusa il 2...e se io c'ho un controllo su una tabella correlata 
questo non si accorge della mancanza del padre e mi fa anche 
peggio...imputa dati a un genitore errato!
 
Per ovviare mi tocca scrivere molto più codice! Ho letto del ROWid ma 
non mi riesce usarlo! e comunque se io reimputo un codice(un integer) 
gia usato me lo accetta...e sono punto a capo! Usare un timestamp è 
scomodo...un codice del tipo 11 o 35 sarebbe più comodo! Assai!
Il classico contatore di access è comodissimo per non scrivere codice 
in più! Si può implementare in sqlite?
 
Grazie!
 
-- 
----- Italliaaaaa 3227! -----
Il coraggio ce l'ho. E' la paura che mi frega.
(Totò)
 
 

 Il classico contatore di access è comodissimo per non scrivere codice in
 
Completamente offtopic ma... Non conosco sqlite direi pero' che tutti i 
db sql hanno un qualche tipo di sequenza nella quale i valori non si 
ripetono. E' chiaro che se forzi tu l'inserimento dell'id, allora c'e' 
poco da fare. C'e' poco da fare anche con i controlli dell'sql perche' 
assicurano solo che non possano esserci due id uguali nello stesso momento.
 
Facciamo che ci spieghi bene cosa devi ottenere?
 
Ciao.
 
-- 
Pubblicita' regresso: 
http://www.ferrero.org
 
** Per scrivermi in mail, sostituire nutella con ferrero...
** To contact me by email, change nutella to ferrero...
 

 peggio...imputa dati a un genitore errato!
 
Se hai una tabella correlata devi mantenere l'integrità referenziale
impedendo la cancellazione del padre oppure cancellando i figli
contestualmente alla cancellazione del padre. Altrimenti il database va
a donnine di facili costumi, con o senza autoincrement.

Nel suo scritto precedente, Wodka40° ha sostenuto :
zac
Uso Sqlite perchè mi serve una cosa agile che giri in aspnet e php
 
La classica relazione
Autore -> Articolo
IDAutore ->IDScrittoDa
 
in sqlite che ha una integrità referenziale inesistente (se non 
replicandola on workaround sui trigger) gestisci la cosa che una query 
con impostato
SELECT blabla WHERE IDAutore = IDSCrittoDA
 
E' comodo perchè se qualche problema ti cancella il campo AUtore i 
figli ti rimangono zoppi la query scoppia e php trappa l'errore...e ti 
accorgi subito del problema di una cancellazione!
Uno obietta...non devi mai fare cose del genere...usa i trigger per 
cancellare i figli...ok...ma mettiamo che il progetto è spippolato 
anche da altri...mettiamolo in sicurezza il più possibile!
 
Se avessi Access avrei il campo "contatore" che mi propone un numero in 
lettura SEMPRE diverso per quella tabella!
 
In Sqlite sembra esserci il tipo rowid che è un integer con queste 
caratteristiche....ma non mi riesce farlo funzionare...sembra un 
normale integer che accetta il mio input!
CREATE TABLE `contenuto`
(
       idcontenuto rowid Not Null PRIMARY KEY ,
       idautore INTEGER NOT NULL,
       data DATETIME,
       titolo TEXT,
       contenuto BLOB,
       commenti INTEGER DEFAULT "0" ,
       matatag TEXT,
       visibile INTEGER DEFAULT "1" ,
       flag INTEGER DEFAULT "1"
 
)
 
Php+sqlite sarà senzaltro usato da qualcuno su questo NG...come ha 
risolto il problema? Se l'è mai posto? E' risolvibile di default 
impostando (e se si come?) questo benedetto rowid?
 
Grazie della pazienza!
 
-- 
----- Italliaaaaa 3227! -----
Io sono Attila:
A come atrocità,
doppia T come terremoto e tragedia,
I come ira di dio,
L come laco ti sangue
e A come adesso vengo e ti sfascio le corna!
(Diego Abatantuono "Attila Flagello di Dio")
 
 

 Grazie della pazienza!
Non se po...si deve gestire da codice l'eventuale cancellazione e 
conflitto...Grazie...scusate ancora!
 
-- 
----- Italliaaaaa 3227! -----
Grembiule nero e fiocco azzurro: per un bambino milanista il primo 
giorno di scuola è un trauma.
(Diego Abatantuono)
 
 

 lettura SEMPRE diverso per quella tabella!
 
Come ti dicevo non conosco sqlite ma direi che si puo'...
 
http://www.sqlite.org/autoinc.html
 
 
"...With AUTOINCREMENT, rows with automatically selected ROWIDs are 
guaranteed to have ROWIDs that have never been used before by the same 
table in the same database..."


 in the same database..."
 
No cosi' non va (l'avevo letto anche io).....in sqlite secondo la doc 
ufficiale impostare
idcontenuto rowid Not Null PRIMARY KEY implicitamente già mette 
l'autoincrement per il fatto delle primary key!..è vero che mi propone 
un numero non ancora usato in quel momento ma usato prima si...il 
problema non è mostrare un numero mai usato...ma mai estratto!
Hai presente un timestamp? un Oid? mai ritroverai un timestamp o un oid 
una guid... uguale in quella tabella !
 
...vabbe son le cattive abitudini che ti porti dietro da 
microsoft!Fatti una qualsiasi tabella in access ed imposta un campo 
contatore(nome infelice....non conta nulla di usabile...ti propone un 
numero che una volta uscito mai più sarà usato per quella tabella)
Mi serviva per mettere in piedi velocemente una demo!
 
Vabbe mi arrangio con qualche riga di codice!
Grazie!
 
-- 
----- Italliaaaaa 3227! -----
Quando vedi la tua verità fiorire sulle labbra del tuo nemico, devi 
gioire, perché questo è il segno della vittoria.
(Giorgio Almirante)
 
 

 un numero non ancora usato in quel momento ma usato prima si...il
 
Mi sembra che la documentazione dica una cosa diversa... dice che se 
metti INTEGER PRIMARY KEY allora il comportamento e' come dici tu, ma se 
scrivi esplicitamente INTEGER PRIMARY KEY AUTOINCREMENT, allora il 
comportamento e' quello scritto sopra e i valori gia' usati non saranno 
riutilizzati...
 
Ciao.


Fabio Ferrero ha detto questo lunedì :
che lo proponga anche prima lo proponeva diverso...
cmq
CREATE TABLE "test" (
"id"  INTEGER PRIMARY KEY AUTOINCREMENT,
"descr"  TEXT
)
 
1 a
2 b
3 c
cancella 2
inserisci e va avanti
1 a
3 c
4 d
il mio errore era considerare la possibilità che un integer fosse altro 
impostando qualche proprietà ...invece rimane un campo integer. Un 
campo contatore di access pur essendo un intero lungo non accetterebbe 
un valore già estratto!Volevo replicare questa possibilità comoda 
quando non hai tempo per fare altro!
 
Tanto che posso fare
un insert values(2 ,"inserito")
ed ottenere un
1 a
2 inserito
3 c
4 d
 
ma aggiungo proprio perchè c'ha una tabella nascosta che tiene traccia 
della sequenza e la incrementa
se fai un bel
insert....VALUES(300, "KKK")...ossia un valore più grande dell più 
grande giò memorizzato nelal tabella
avrai un
1 a
....
300 KKK
e il prossimo insert automatico ti darà come proposta
301 lasciando eventuali buchi!
 
Comunque ho risolto con i trigger e foreign_keys
su it.comp.software.database ho detto come...non vorrei andare troppo 
ot!
 
Grazie a tutti
 
-- 
----- Italliaaaaa 3227! -----
Ho visto cose che voi umani non potreste immaginare... navi da 
combattimento in fiamme al largo dei bastioni di Orione. E ho visto i 
raggi B balenare nel buio vicino alle porte di Tannhauser. E tutti quei 
momenti andranno perduti nel tempo come lacrime nella pioggia. È tempo 
di morire...
 
Unità NEXUS6 Roy Batty N6MAA10816 Ment.LEV A