Hi Sandro,

I have only one detail to add: the MAX+1 policy that is used when AUTOINCREMENT 
is not declared can lead to re-use of previously used ROWIDs long before 
reaching the max possible value for an INTEGER 64bit. User just needs to delete 
the record with the highest ROWID. I trust that triggers in SpatiaLite behave 
right but I just want to emphasize for other readers that re-using ROWIDs is 
not really "an highly unrealistic condition" and it must be considered if ROWID 
is used as a foreign key.  Re-use happens always and inevidently for example if 
table is truncated. Test with this SQL and table foo2 will have ROWID=1 
(calculated as 0+1=1) while table foo3 has  ROWID=2 because that value is taken 
from a sequence by autoincrement.

create table foo2 (id INTEGER PRIMARY KEY,bar INTEGER);
create table foo3 (id INTEGER PRIMARY KEY AUTOINCREMENT,bar INTEGER);
insert into foo2 (bar) values (1);
insert into foo3 (bar) values (1);
delete from foo2;
delete from foo3;
insert into foo2 (bar) values (2);
insert into foo3 (bar) values (2);



-Jukka-


________________________________________
Lähettäjä: a.furi...@lqt.it <a.furi...@lqt.it>
Lähetetty: 7. maaliskuuta 2017 18:01
Vastaanottaja: Rahkonen Jukka (MML)
Kopio: Even Rouault; gdal-dev@lists.osgeo.org
Aihe: Re: [gdal-dev] sqlite -> spatialite (rowid)

On Tue, 7 Mar 2017 15:07:04 +0000, Rahkonen Jukka (MML) wrote:
> Hi,
>
> I have a slight feeling that there may be some trouble if attribute
> "ROWID" is INTEGER PRIMARY KEY but it does not AUTOINCREMENT and
> users
> do lot of deletes and inserts. Maybe not if the triggers in r-tree
> tables are clever enough. Just a slight feeling but perhaps you
> should
> test also cases where ROWID differs from OID and __ROWID__?
>

Hi Jukka,

we can safely exclude any possible dangerous side-effect.

in SQLite any INTEGER PRIMARY KEY definition will always
ensure that an appropriate value will be automatically
set if not explicitly provided.

what exactly does the AUTOINCREMENT keyword is just
slightly changing the mechanism adopted to automatically
assign PK values.

1. not declaring AUTOINCREMENT
    SQLite will search for the biggest PK value, and
    will adopt this value increased by 1 as the new
    PK value.
    if the max possible value for an INTEGER 64bit
    has already been used (an highly unrealistic
    condition) then SQLite will search if there
    is some free "hole" in the PK sequence, and
    will reuse the first unused value it can find
    note: in this exceptional case it's not
    exactly true that ROWIDs will be generated
    in a regularly ascending order; sometimes
    lower values could be possibly returned.

2. declaring AUTOINCREMENT
    in this case the automatically generated PK
    values can never return back; they can simply
    growth until the maximum value supported
    by an INTEGER 64bit is reached.
    and at this point the auto-sequence will
    definitely stop working.

bye Sandro


_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to