1

我有一个包含复合主键的表,我无法插入。用于创建表的代码是:

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.

并且第二次插入没有进入数据库。为什么会出现这个错误?我认为复合主键要求两个值的组合是唯一的。在我上面的插入中,EventName 列的值是不同的,即使 CourseId 的值是相同的。这不应该被视为 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();
}

这会导致问题吗?

4

2 回答 2

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");

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

于 2010-12-01T13:50:33.610 回答
0

你不能做出那样的组合,但你不需要它们。是什么阻止您拥有一个真正的 id 列?

于 2010-12-01T13:48:01.063 回答