如何使用_id创建一个表作为复合主键?

时间:2014-05-19 11:58:46

标签: android sqlite

我是android sqlite的新手。

问题:

创建一个包含三列(即column1,column2和column3)的表,所有类型TEXT .Column1和Column2应该一起形成一个复合主键。此外,该表将由CursorAdapter使用。因此,创建_id字段变得必要。

直到现在:

  • 能够使用以下查询创建一个不带_id的表,其中column1和column2为PK:

    CREATE TABLE Test ( column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(column1,column2 ));

  • 能够创建一个_id为AUTOINCREMENT

    的表格

    CREATE TABLE Test ( _id INTEGER PRIMARY KEY AUTOINCREMENT, column1 TEXT, column2 TEXT, column3 TEXT);

但我无法创建两者的组合。

我尝试了以下查询并且都给出了错误:

1> CREATE TABLE Test ( _id INTEGER AUTOINCREMENT, column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id ,column1,column2 ));

2 - CREATE TABLE Test ( _id INTEGER , column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id AUTOINCREMENT,column1,column2 ));

因此,请帮助我创建具有下述功能的表格,例如

  • 应该有_id自动增量字段
  • 应该在column1和column2
  • 上有一个复合主键

3 个答案:

答案 0 :(得分:3)

  

因此,必须创建一个_id AUTOINCREMENT字段。

不完全是。 Cursor需要一个唯一的_id INTEGER列。如果你有INTEGER PRIMARY KEY,你可以使用ROWID。如果没有,请使用SELECT ROWID AS _id, ...

...

其中CursorAdapter是查询的其余部分。这允许您单独保留表模式,但仍满足{{1}}要求。

(以及我希望谷歌在2008年再次指出这一点......)

答案 1 :(得分:0)

如果您使用ROWID方法,如果多个解析器立即呼叫您的提供商,您是否打开自己的竞争条件?例如,让我们说一些应用程序会删除第5行,将所有ROWID向下移动1 ..如果在数据集刷新之前单击更新同一行,您将最终写入行# 6,因为您使用的是行号而不是唯一的ID(ID会阻止这一点,因为SQLiteDatabase是线程安全的)。如果这是真的,使用唯一ID可能很重要,即使它占用了一个额外的列..想知道肯定..

答案 2 :(得分:-1)

试试这个,

CREATE TABLE IF NOT EXISTS Test ( _id INTEGER, column1 TEXT, column2 TEXT, column3 TEXT, PRIMARY KEY(_id,column1,column2));