主键删除SQLite后减少外键

时间:2017-12-15 19:39:15

标签: android mysql database sqlite android-sqlite

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 + "))";

1 个答案:

答案 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 创建别名。
  • rowid 通常不可见,例如column_name INTEGER PRIMARY KEY,不会包含 rowid 列。然而;它将包含 rowid 的别名。
  • 您可以通过将 rowid 指定为列来包含 rowid ,例如SELECT * rowid 和所有其他列)
  • SELECT rowid, * 关键字进行编码会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。

您可能希望看一下: -