Is it bad to have text as a primary key in an SQLite database? I heard that it's bad for performance reasons, is this true? And will the rowid be used as the actual primary key in such a case?
相关问题
- How can I create this custom Bottom Navigation on
- Bottom Navigation View gets Shrink Down
- How to make that the snackbar action button be sho
- Listening to outgoing sms not working android
- How to create Circular view on android wear?
In real world, using strings as primary key has a lot of benefits if we are talking about UUIDs. Being able to create entity "passport" exactly at the moment of its creation can massively simplify asynchronous code and/or distributed system (if we are talking about more complex mobile client / server architecture).
As to the performance, I did not find any measurable difference when running a benchmark to perform 10000 primary key lookups, as in reality, database indexes neither store nor compare strings when running indexed searches.
From correctness point of view,
TEXT PRIMARY KEY
is all right.From performance point of view, prefer
INTEGER
keys. But as with any performance issue, measure it yourself to see if there's a significant difference with your data and use cases.Only
INTEGER PRIMARY KEY
gets aliased withROWID
. Other kinds of primary keys don't, and there will be the implicit integer rowid unlessWITHOUT ROWID
is specified. Reference.Yes, if you use TEXT you get android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: TableName.ColumnName (code 1555)
SQLite has session to insert and return the row ID of the last row inserted, if this insert is successful. else will return -1.
return is mapped to _ID , this is the reason they force you interface BaseColumns for the table
its strange that insert call has to return the rowid, instead of a boolean or so
I wish TEXT PRIMARY KEY capability was there in sqlite
I never heard that somebody used string as primary key in table. For me (and I honestly hope also for others) very "ugly" practise with very low performance.
If you'll use string as primary key you needs to think about a "few" things:
Here, each row must have same format (readability issue of course) and also be unique. Oh! Here is next "piggy work"
->
you'll need to create some "unique string generator" that will generate unique1 string identificator2.And also there are next issues is good to consider:
=
automatically harder and harder to compareIt's more complex theme but i would like to say that OK, for very small tables would be possible to use strings as primary key (if it makes a sence) but if you'll look at disadvantages it's much more better technique to use number as primary key for sure!
And what is conclusion?
I don't recommend you to use string as primary key. It has more disadvantages as advantages (it has really some advantage?).
Usage of number as primary key is much more better (I'm scared to say the best) practise.
If you will use string as primary not.
1In real strings are rarely unique.
2Of course, you could say that you can create identificator from name of item in row, but it's once again spaghetti code (items can have same name).