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 + "))";
答案 0 :(得分:1)
自动增量会这样做吗?
不,实际上编码 AUTOINCREMENT
,会限制重复使用未使用的 rowid 。
除非您指定 WITHOUT ROWID
,否则SQLite会为每一行创建一个unqiue标识符 rowid 。此标识符称为 rowid 。
如果您编码 column_name INTEGER PRIMARY KEY
,则 column_name 是 rowid 的别名(例如CREATE TABLE x (_id INTEGER PRIMARY KEY, another_column TEXT)
创建包含2列的表格x,列 _id 是 rowid 的别名
rowid 将是一个更高的值(首先是 1 ),通常是下一个,通常是1,2等,除非使用了最高的数字{{1在这种情况下 9223372036854775807
如果编码或不符合以下条件: -
如果 AUTOINCREMENT
已被编码(即AUTOINCREMENT
)。 column_name INTEGER PRIMARY KEY AUTOINCREMENT
保证较高的 rowid ,因此一旦达到AUTOINCREMENT
,就会引发SQLITE_FULL异常;和
9223372036854775807
强制插入 rowid 的别名,其中 AUTOINCREMENT 已被编码,则会发生SQLITE_FULL异常如果尝试另一个插入。 如果没有 9223372036854775807
,SQLITE会随机选择一个未使用的 rowid (例如您删除的行)。
AUTOINCREMENT
关键字可确保 rowid 更大。
AUTOINCREMENT
未编码时会导致一个唯一的通常递增列作为 rowid 。WITHOUT ROWID
为 rowid 创建别名。column_name INTEGER PRIMARY KEY
,不会包含 rowid 列。然而;它将包含 rowid 的别名。SELECT *
( rowid 和所有其他列)。SELECT rowid, *
关键字进行编码会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。您可能希望看一下: -