这里是 SQL 菜鸟。我正在设计一个 GPS 跟踪器应用程序并有两个表;轨道描述符表和轨道数据表。轨道描述符表有主键(自增),轨道数据表有外键。我希望在从描述符表中删除一行后,所有大于该键的键都递减 1(自动增量会这样做吗?)。我也希望在数据表中发生同样的事情,其中所有大于 deleted 的键都会递减。 我正在为 Android 开发并且知道如何通过这种方法进行开发:How do I add and subtract numbers in SQLite for android? .但这似乎非常耗费资源,有没有办法在创建表(触发器)时做同样的事情? 这是两个表的声明(对 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 + "))";
最佳答案
does autoincrement do this?
不,实际上编码 AUTOINCREMENT
,限制未使用的 rowids 的重复使用。
除非您指定 WITHOUT ROWID
,否则 SQLite 会为每一行创建一个唯一标识符 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 等等,除非使用了最高的数字 9223372036854775807
在这种情况下 AUTOINCREMENT
是否编码被认为如下:-
如果 AUTOINCREMENT
已编码(即 column_name INTEGER PRIMARY KEY AUTOINCREMENT
)。 AUTOINCREMENT
保证更高的 rowid,因此一旦 9223372036854775807
达到 SQLITE_FULL引发异常;和
- 如果您使用值
9223372036854775807
强制插入 rowid 的别名,其中 AUTOINCREMENT 已编码,则 SQLITE_FULL如果尝试另一个插入将发生异常。
如果没有 AUTOINCREMENT
,SQLITE 会随机选择一个未使用的 rowid (例如,您删除的行)。
AUTOINCREMENT
关键字因此确保 rowid 会更大。
- 当
WITHOUT ROWID
未编码时,会导致一个唯一的通常递增的列作为 rowid。 - 使用
column_name INTEGER PRIMARY KEY
为 rowid 创建别名。 - rowid 通常不可见,即
SELECT *
,将不包括 rowid 列。然而;它将包括 rowid 的别名。 - 您可以通过将 rowid 指定为列来包含它,例如
SELECT rowid, *
(rowid 和所有其他列)。 - 编写
AUTOINCREMENT
关键字会增加额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要。
你不妨看看:-
关于android - 删除主键SQLite后递减外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47838907/