android - 删除主键SQLite后递减外键

标签 android mysql database sqlite android-sqlite

这里是 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 KEYcolumn_namerowid 的别名 (例如 CREATE TABLE x (_id INTEGER PRIMARY KEY, another_column TEXT) 创建包含 2 列的表 x,列 _idrowid 的别名)

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 KEYrowid 创建别名。
  • rowid 通常不可见,即 SELECT *,将不包括 rowid 列。然而;它将包括 rowid 的别名。
  • 您可以通过将 rowid 指定为列来包含它,例如SELECT rowid, * (rowid 和所有其他列)
  • 编写 AUTOINCREMENT 关键字会增加额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要。

你不妨看看:-

关于android - 删除主键SQLite后递减外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47838907/

相关文章:

java - 获取文件扩展名方法无法正常工作

mysql - 需要帮助格式化 MySQL 查询的 CONCAT()

java - 如何在 pgadmin 中删除数据库

android - 如何混合两个WAV文件而不会产生噪音?

android - 预期类( 'com.google.android.gms.location.FusedLocationProviderClient' 的声明)在 native react 中

java - 如何从 Activity 外部移动到另一个 Activity android

php - 未定义的属性:stdClass::($variablename)

php - 如果字段留空(十进制)MySQL/PHP,则插入 NULL

java - 在Java中,Spring无需任何脚本即可维护数据库

php - MySQL 中检查外部引用最快的方法是什么