Where did you get your pre-occupation with BIGINT? Sqlite handles INTEGERS and makes them up to 64 bits as necessary. An INTEGER primary key will autoincrement,.
Sql;ite lets you introduce a type BIGINT as a declared type, but makes its own decision as to underlying type. Nathan Catlow wrote: > Please understand that the problem boils down to this: > > Why can't I CREATE TABLE t(i BIGINT PRIMARY KEY) and have it autoincrement? > > What internal mechanisms am I breaking by defining it like this? > > This would make the "reverse trip" easier surely? Well it would for me > anyway (It allows me to easily import into mysql without writing an > "edit program", mysql understands TEXT too). > > My patch works for me, so i can go with that, I'm just unsure about > the reasonings behind the autoincrement restriction. Which is just a > syntax parsing issue in the end. > > Or am I demanding too much? > > regards, > > nat > > Quoting "John Stanton" <jo...@viacognis.com>: > > >> You are still missing something. Apply some deeper thought to the >> concepts behind Sqlite and the elegance will become clear. At run time >> the Sqlite programmer has access to the declared type and the actual >> storage type of the data. An API layer between the Sqlite API and the >> application can resolve any data format issues. >> >> Note that Sqlite maps to commonly used scripting systems seamlessly. >> Transferring data from somethiong like Mysql/DB2/Oracle/PostreSQL etc is >> very simple. Making the reverse trip may not be so simple and in >> general would require some form of edit program to transform TEXT >> columns into the typed columns of say Mysql. If such a transfer is >> important to you an application software layer can enforce the decclared >> types of Sqlite. Otherwise use Mysql or preferably PostreSQL. >> >> Finally, Sqlite is simple and easy to use, hence the "lite". Let it >> make life easy for you and don't fight it. You will be rewarded handsomely. >> >> Nathan Catlow wrote: >> >>> Quoting "John Stanton" <jo...@viacognis.com>: >>> >>> >>> >>>> You have not grasped the fundamental concept of typing used by Sqlite. >>>> It implements manifest typeing in the manner of scripting systems like >>>> Javascript etc. It has a clever feature which permits you to declare a >>>> type as anything you like and parses that name to decide on the >>>> underlying type as basically either text or numeric. It decides at run >>>> time how to store the data. >>>> >>>> >>> Yes, I understand this, sqlite's lovelyness. >>> >>> >>> >>>> The declared type in Sqlite is in essence an assist for the programmer >>>> and is useful at application level to determine how to handle a column. >>>> For example a floating point number declared as DATE would be processed >>>> differently from one declared as ISOTOPE_COUNT. >>>> >>>> >>> You've hit the nail on the head, I am trying to do exactly that! >>> Providing an assist for an application level by explicitly declaring >>> PRIMARY KEY BIGINT. This can then be transferred safely to another >>> database (mysql in this example) even by doing the following; >>> >>> $ sqlite3 sqlitedb .d > out.sql >>> shell> mysql mysqldb < out.sql >>> >>> All the autoincrement values can now be safely carried across because >>> I could provide the assistance with an explicit BIGINT (This is >>> already possible but *without* the autoincrement feature) >>> >>> I fail to understand the limiting of autoincrement to just INTEGER >>> where there is no difference internally to sqlite between INTEGER and >>> BIGINT etc. It is just an unnecessary restriction. >>> >>> Consider this 2 line patch which works against sqlite-3.6.2, it could >>> be extended to all the other (external) integer types with no adverse >>> effect. Am I missing something here? >>> >>> --- build.c.old 2008-12-14 20:53:19.000000000 +0000 >>> +++ build.c 2008-12-14 16:29:03.000000000 +0000 >>> @@ -1165,7 +1165,7 @@ >>> if( iCol>=0 && iCol<pTab->nCol ){ >>> zType = pTab->aCol[iCol].zType; >>> } >>> - if( zType && sqlite3StrICmp(zType, "INTEGER")==0 >>> + if( zType && (sqlite3StrICmp(zType, "INTEGER")==0 || >>> sqlite3StrICmp(zType, "BIGINT")==0) >>> && sortOrder==SQLITE_SO_ASC ){ >>> pTab->iPKey = iCol; >>> pTab->keyConf = onError; >>> @@ -1174,7 +1174,7 @@ >>> }else if( autoInc ){ >>> #ifndef SQLITE_OMIT_AUTOINCREMENT >>> sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " >>> - "INTEGER PRIMARY KEY"); >>> + "INTEGER or BIGINT PRIMARY KEY"); >>> #endif >>> }else{ >>> sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, >>> sortOrder, 0); >>> >>> Thank you for all your patience. >>> >>> regards, >>> >>> Nathan >>> >>> >>> >>>> Ypu can rely on Sqlite storing large integer value as 64 bits and a >>>> small one using less space. The actual storage form for a particular >>>> column may vary from row to row according to decisions made by Sqlite at >>>> run time after it analyzes the data value. >>>> JS >>>> >>>> Hi, >>>> >>>> >>>>> I am perfectly aware of the size of INTEGERS on differing platforms >>>>> and of sqlite's typeless nature. >>>>> >>>>> Can you tell me why you can even specify BIGINT to sqlite then? Or >>>>> SMALLINT or any other datatype? What is the difference between INTEGER >>>>> and any other type? none of course! >>>>> >>>>> sqlite> CREATE TABLE t(i SMALLINT, t TEXT); >>>>> sqlite> INSERT INTO t(i,t) VALUES(9999999999999999, 'test'); >>>>> sqlite> SELECT * FROM t; >>>>> 9999999999999999|test >>>>> >>>>> But there is a difference, autoincrement ONLY works with "INTEGER", >>>>> why? sqlite quite rightly allows the code above due to all types being >>>>> treated the same, but all of a sudden starts getting all fussy when I >>>>> want to autoincrement a BIGINT. If ROWID == INTEGER then it must match >>>>> the others too ROWID == INTEGER == BIGINT == SMALLINT sqlite just >>>>> shouldn't care. >>>>> >>>>> The point about "cross platform SQL" and using a library like libdbi, >>>>> is that it tries to ensure that a particular length of data can fit in >>>>> all makes of SQL. >>>>> >>>>> My code drives the databases not the other way around, so if *I* >>>>> decide an integer is only 32bits, then I don't give a damn if >>>>> sqlite/oracle or whatever wastes space be putting it in a 64bit space. >>>>> The ultimate goal is running the same code on all DB engines. The goal >>>>> is not to take an arbitrary database and expect libdbi to read it >>>>> efficiently or even correctly. >>>>> >>>>> The only thing I have no control over is when using the autoincrement >>>>> feature, as this is driven by sqlite, and will always attempt to use >>>>> the full 64bit space. I need to know this to ensure the correct memory >>>>> is allocated. >>>>> >>>>> I completely accept your point about assumption, but there has to be a >>>>> compromise on allocating 64bits everywhere, which is inefficient on >>>>> small systems. I want to raise this point with the libdbi developers. >>>>> Their code is broken, I know that, but an acceptable compromise is >>>>> nearly there. I just need to determine that a field is a >>>>> autoincrementing PRIMARY KEY or be able to explicitly state BIGINT >>>>> PRIMARY KEY. >>>>> >>>>> I have one question, lets forget about the argument about types, it is >>>>> a red herring. >>>>> >>>>> Is there a way through sqlite API or PRAGMA to determine a field is an >>>>> autoincrementing INTEGER PRIMARY KEY? The only way i've found is to >>>>> parse the create table statement from sqlite_master which is cludgy. >>>>> >>>>> PRAGMA table_info(t); >>>>> PRAGMA index_list(t); >>>>> >>>>> Both those give me no love. >>>>> >>>>> I suppose if i wrote my own autoincrement all this would go away as I >>>>> could ensure its length. >>>>> >>>>> regards, >>>>> >>>>> Nathan >>>>> >>>>> >>>>> >>>>> ---------------------------------------------------------------- >>>>> This message was sent using IMP, the Internet Messaging Program. >>>>> _______________________________________________ >>>>> sqlite-users mailing list >>>>> sqlite-users@sqlite.org >>>>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>>>> >>>>> >>>>> >>>> _______________________________________________ >>>> sqlite-users mailing list >>>> sqlite-users@sqlite.org >>>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>>> >>>> >>>> >>> >>> ---------------------------------------------------------------- >>> This message was sent using IMP, the Internet Messaging Program. >>> _______________________________________________ >>> sqlite-users mailing list >>> sqlite-users@sqlite.org >>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>> >>> >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users@sqlite.org >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> >> > > > > ---------------------------------------------------------------- > This message was sent using IMP, the Internet Messaging Program. > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users