【问题标题】:AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY - androidAUTOINCREMENT 只允许在 INTEGER PRIMARY KEY 上使用 - android
【发布时间】:2014-10-23 02:59:59
【问题描述】:

我正在尝试在我的数据库中创建一个表,其 ID 本身是自动递增的,但是每当我尝试将 AUTOINCREMENT 关键字添加到我的查询时,它都会告诉我:

AUTOINCREMENT 只允许在 INTEGER PRIMARY KEY 上使用

这是我的查询:

@Override
public void onCreate(SQLiteDatabase db) {
    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TASKS + " ( "
            + KEY_ID + "INTEGER PRIMARY KEY AUTOINCREMENT, "
            + KEY_NOTETITLE + " TEXT, " + KEY_NOTECONTENT + " Text, "
            + KEY_STATUS + " INTEGER)";
    db.execSQL(sql);
}

我也尝试过编写 AUTO_INCREMENT,但后来出现语法错误。

我发现这是问题的根源,因为每当我尝试删除 AUTOINCREMENT 字时,它都可以正常工作。

那么……你认为问题出在哪里?

【问题讨论】:

  • 相关:如果你想在 SQLite 中创建一个自动递增的非主键列(谷歌把我带到这里),请参阅this answer

标签: android sqlite auto-increment


【解决方案1】:

您需要在KEY_ID AND INTEGER 之间添加一个空格

所以改变

+ KEY_ID + "INTEGER PRIMARY KEY AUTOINCREMENT, "

+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "

【讨论】:

    【解决方案2】:

    使用整数主键创建表,无需显式提及 AUTOINCREMENT

    例如

    CREATE TABLE t1(
      a INTEGER PRIMARY KEY,
      C TEXT
    ); 
    
    Insert into t1(C) values("Hello");
    

    【讨论】:

    • 如果没有自动增量,sqlite 可能会重复使用已删除的 id。
    • @loshadvtapkah PRIMARY KEY 将使用大于最后一行 id 的未使用整数:来源:sqlite.org/autoinc.html
    • @RameshKumar 是的,但这并不意味着它不会重用 ID。如果我删除了几条具有最高 id 的记录,它们将被重用。在大多数情况下,这根本不是问题,但即使应用程序跟踪外键检查,最好不要重复使用键,以避免一个错误由于另一个错误。
    【解决方案3】:

    像这样创建表在 INTEGER 之前放置一些空间 ....

    "CREATE TABLE "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY KEY AUTOINCREMENT)";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2019-08-19
      相关资源
      最近更新 更多