【问题标题】:Android SQLite auto incrementAndroid SQLite 自动增量
【发布时间】:2011-12-08 17:10:43
【问题描述】:

我目前有一个名为 User 的表,它有一个 id 列,它被创建为

'整数主键'

假设我创建了两个用户,所以表的 id 为 1 和 2

如果我删除第二个用户并创建第三个 id 为 2 的用户,我需要将其设为 3

看来 Android 正在选择下一个可用的 id,如何将其更改为更像序列号?

问候

【问题讨论】:

  • 但是你需要主键,这很好用。为什么你需要这个?

标签: android sqlite


【解决方案1】:

设为INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL。这是the docs 所说的:

如果列的类型为 INTEGER PRIMARY KEY AUTOINCREMENT 则...选择的 ROWID 因为新行至少比最大的 ROWID 大一 以前曾经存在于同一张桌子上。

AUTOINCREMENT 关键字实现的行为很巧妙 与默认行为不同。使用 AUTOINCREMENT,行 自动选择的 ROWID 保证具有 以前从未被同一个数据库中的同一张表使用过。和 保证自动生成的 ROWID 是单调的 增加。

【讨论】:

  • 我想要AUTOINCREMENT 没有PRIMARY KEY。因为我分配的主键是另一列,所以我使用_ID INTEGER AUTOINCREMENT NOT NULL 这会出错。请帮助我兄弟。
  • @reegan29 AUTOINCREMENT 只能与整数主键一起使用。根据 ,因为 AUTOINCREMENT 关键字会更改 ROWID 选择算法的行为,所以在 WITHOUT ROWID 表或除 INTEGER PRIMARY KEY 之外的任何表列上都不允许使用 AUTOINCREMENT。任何尝试在 WITHOUT ROWID 表或除 INTEGER PRIMARY KEY 列之外的列上使用 AUTOINCREMENT 都会导致错误。 SQLite Autoincrement
【解决方案2】:

SQLite AUTOINCREMENT 是用于自动增加表中字段值的关键字。我们可以在创建具有特定列名的表时使用AUTOINCREMENT关键字自动递增字段值以自动递增它。

关键字AUTOINCREMENT 只能与INTEGER 字段一起使用。 语法:

AUTOINCREMENT关键字的基本用法如下:

CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

例如见下图: 考虑如下创建COMPANY 表:

sqlite> CREATE TABLE TB_COMPANY_INFO(
   ID INTEGER PRIMARY KEY   AUTOINCREMENT,
   NAME           TEXT      NOT NULL,
   AGE            INT       NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

现在,将以下记录插入到表TB_COMPANY_INFO

INSERT INTO TB_COMPANY_INFO (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'MANOJ KUMAR', 40, 'Meerut,UP,INDIA', 200000.00 );

现在选择记录

SELECT *FROM TB_COMPANY_INFO
    ID      NAME            AGE     ADDRESS             SALARY
    1       Manoj Kumar     40      Meerut,UP,INDIA     200000.00

【讨论】:

  • 谢谢...我需要“INTEGER PRIMARY KEY AUTOINCREMENT”作为自动增量字段......并且得到了它。
  • 射击,我把AUTOINCREMENT 放错了位置。谢谢你的例子!
【解决方案3】:

如果代表ANDROID,是的,以上答案都是正确的,除了id列的命名。

   database.execSQL("CREATE TABLE IF NOT EXISTS "
                + TableName
                + " ( rowid INTEGER PRIMARY KEY AUTOINCREMENT,  Raqam VARCHAR, ChandBor INT(3));");

看起来在 Android 中它应该被命名为“rowid”。 使用 Cursor 你需要像这样实例化它:

Cursor cursorLcl = database.rawQuery("SELECT *," + TableName + ".rowid AS rowid" + " FROM " +
                TableName, null);

否则它对我不起作用。我不知道为什么会这样。

【讨论】:

    【解决方案4】:

    在写入数据库(即执行)时,请记住 android,

    做 INSERT INTO TABLE_NAME (param1name, param2name) VALUES (param1,param2)

    并且无需为自动增量添加占位符。添加记录时会自行添加。如果您不声明要输入的参数,您将得到错误 x 预期的变量数量并且您只给出 x-1,这是因为您不应该为自动增量列提供任何位置值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2017-03-07
      • 2019-09-09
      相关资源
      最近更新 更多