SQL Noob在这里。我正在设计一个GPS跟踪器应用程序,并有两个表;轨道描述符表和轨道数据表。轨道描述符表具有主键(自动增量),轨道数据表具有外键。我想从描述符表中删除一行后,所有大于该键的键都减1(自动增量是否这样做?)。我也希望在数据表中发生同样的事情,其中所有大于删除的键都会递减。我正在为Android开发,并且已经知道如何通过这种方法来实现:How do I add and subtract numbers in SQLite for android?。但这似乎是非常耗费资源的,有没有办法在Table创建(触发器)时做同样的事情?这是两个表的声明(抱歉Java !!!):
// TRACK_DESCRIPTION table create statement
String createTableTrackDescription =
"CREATE TABLE " + Constants.TABLE_TRACK_DESCRIPTION + "("
+ Constants.COL_TRACK_DESC_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ Constants.COL_TRACK_NAME + " TEXT,"
+ Constants.COL_LOCATION + " TEXT)";
// TRACK_DATA table create statement
String createTableTrackData =
"CREATE TABLE " + Constants.TABLE_TRACK_DATA + "("
+ Constants.COL_TRACK_DATA_ID + " INTEGER,"
+ Constants.COL_LATITUDE + " REAL,"
+ Constants.COL_LONGITUDE + " REAL,"
+ Constants.COL_SPEED + " REAL,"
+ Constants.COL_ALTITUDE + " INTEGER,"
+ Constants.COL_TIMESTAMP + " INTEGER,"
+ "FOREIGN KEY(" + Constants.COL_TRACK_DATA_ID + ") REFERENCES "
+ Constants.TABLE_TRACK_DESCRIPTION + "(" + Constants.COL_TRACK_DESC_ID + "))";
自动增量这样做吗?
不,实际上编码AUTOINCREMENT
,限制了未使用的rowid的重复使用。
除非指定qazxsw poi,否则SQLite会为每一行创建唯一标识符rowid。该标识符称为rowid。
如果您对WITHOUT ROWID
进行编码,则column_name是rowid的别名(例如,column_name INTEGER PRIMARY KEY
创建具有2列的表x,列_id是rowid的别名)
rowid将是一个更高的值(首先它是1),通常是下一个通常1,2等,除非使用最高数量CREATE TABLE x (_id INTEGER PRIMARY KEY, another_column TEXT)
,在这种情况下9223372036854775807
如果编码或不被认为如下: -
如果AUTOINCREMENT
已被编码(即AUTOINCREMENT
)。 column_name INTEGER PRIMARY KEY AUTOINCREMENT
保证更高的rowid,所以一旦达到AUTOINCREMENT
,就会引发9223372036854775807
异常;和
如果没有9223372036854775807
,SQLITE会随机选择一个未使用的rowid(例如您删除的行)。
因此,AUTOINCREMENT
关键字可确保rowid更大。
AUTOINCREMENT
未编码时,会导致一个唯一的通常递增列作为rowid。WITHOUT ROWID
为rowid创建了一个别名。column_name INTEGER PRIMARY KEY
,不包括rowid列。然而;它将包含rowid的别名。SELECT *
(rowid和所有其他专栏)。SELECT rowid, *
关键字会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。你不妨看看: -
AUTOINCREMENT