主键删除SQLite后减少外键

问题描述 投票:1回答:1

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 + "))";
android mysql database sqlite android-sqlite
1个回答
1
投票

自动增量这样做吗?

不,实际上编码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异常;和

  • 如果强制使用值SQLITE_FULL插入已编码AUTOINCREMENT的rowid的别名,则在尝试另一次插入时将发生SQLITE_FULL异常。

如果没有9223372036854775807,SQLITE会随机选择一个未使用的rowid(例如您删除的行)。

因此,AUTOINCREMENT关键字可确保rowid更大。

  • AUTOINCREMENT未编码时,会导致一个唯一的通常递增列作为rowid。
  • 使用WITHOUT ROWID为rowid创建了一个别名。
  • rowid通常不可见,即column_name INTEGER PRIMARY KEY,不包括rowid列。然而;它将包含rowid的别名。
  • 您可以通过将rowid指定为列来包含该行。 SELECT *(rowid和所有其他专栏)。
  • 编码SELECT rowid, *关键字会产生额外的CPU,内存,磁盘空间和磁盘I / O开销,如果不是严格需要,应该避免使用。通常不需要它。

你不妨看看: -

© www.soinside.com 2019 - 2024. All rights reserved.