插入具有复合主键的android sqlite3表时出现问题

时间:2010-12-01 13:44:21

标签: android sqlite insert composite-primary-key

我有一张带有复合主键的表格,但我无法插入。用于创建表的代码是:

CREATE TABLE ClassEvent (
    EventName varchar(10) NOT NULL, 
    CourseId varchar(10) NOT NULL, 
    EventType varchar(20), 
    EventWeight number(3), 
    DueDate DATE NOT NULL, 
    FOREIGN KEY (CourseId) REFERENCES Courses(CourseId), 
    PRIMARY KEY (CourseId, EventName));

我遇到的问题是当我想插入具有可能对于CourseId或EventName列不唯一的值的记录时,但是它们是2的唯一组合。 例如,如果我尝试运行以下2个插入:

INSERT INTO ClassEvent VALUES('Assignment 1','60-415','Assignment',10,'12/10/2010');
INSERT INTO ClassEvent VALUES('Project 1','60-415','Project',15,'5/12/2010');

我收到以下错误:

Error: columns CourseId, EventName are not unique.

并且第二个插入不会进入DB。为什么会出错?我认为复合主键要求两个值的组合都是唯一的。在上面的插入中,即使CourseId的值相同,EventName列的值也不同。这不应该被视为2个独特的组合,因此有2个不同的主键吗?

我的表需要能够为每个CourseId保存几个不同的事件,但每个事件对于每个课程必须是唯一的。我需要能够在表中插入值,如:

EventName CourseId 作业1 60-415 项目1 60-415 作业2 60-415 项目2 60-415 作业1 60-367 项目1 60-367

等等。任何人都可以告诉我如何让这个工作?为什么这些复合PK不会被视为唯一条目?任何帮助将非常感激。


这是我用于插入的java函数:

public void addNewClassEvent(ContentValues values) {
    SQLiteDatabase db = openConnection();

    db.insert("ClassEvent", null, values);
    db.close();
}

这会导致问题吗?

2 个答案:

答案 0 :(得分:2)

你可以在SQLite中拥有一个复合主键 必须在创建表时创建密钥:

   CREATE TABLE example1(
      field1 FLOAT,
      field2 TEXT,
      PRIMARY KEY(field1, field2)
   );

使用ALTER TABLE后无法创建主键。

另一方面,您可以在事后创建一个UNIQUE INDEX 它与PRIMARY KEY具有基本相同的效果:

   CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");

我不确定您是如何创建的,以及如果您稍后添加了主索引,但是将数据库抓到桌面,并查看桌面环境中的工作方式。

答案 1 :(得分:0)

你不能制作这样的组合,但你不需要它们。什么阻止你拥有一个真正的id列?