首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入具有复合主键的android sqlite3表的问题

插入具有复合主键的android sqlite3表的问题
EN

Stack Overflow用户
提问于 2010-12-01 13:44:21
回答 2查看 1.9K关注 0票数 1

我有一个带有复合主键的表,我在插入时遇到了困难。用于创建表的代码是:

代码语言:javascript
复制
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个插入:

代码语言:javascript
复制
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');

我得到以下错误:

代码语言:javascript
复制
Error: columns CourseId, EventName are not unique.

第二个插入没有进入DB。为什么这个错误会消失?我认为复合主键要求两个值的组合是唯一的。在我的上述插入中,EventName列的值是不同的,尽管CourseId的值是相同的。这不应该被看作是两个独特的组合,从而两个不同的主键吗?

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

EventName CourseId分配1 60-415项目1 60-415 Assignment2 60-415项目2 60-415分配1 60-367项目1 60-367

诸若此类。有人能告诉我怎样才能让这件事起作用吗?为什么这些复合PK不被看作是唯一的条目?任何帮助都将不胜感激。

下面是用于插入的java函数:

代码语言:javascript
复制
public void addNewClassEvent(ContentValues values) {
    SQLiteDatabase db = openConnection();

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

这可能是问题的根源吗?

EN

回答 2

Stack Overflow用户

发布于 2010-12-01 13:50:33

您可以在SQLite中拥有一个复合主键,但是在创建表时必须创建该键:

代码语言:javascript
复制
   CREATE TABLE example1(
      field1 FLOAT,
      field2 TEXT,
      PRIMARY KEY(field1, field2)
   );

不能在使用ALTER之后创建主键。

另一方面,您可以在以下事实之后创建一个唯一的索引,该索引与主键的效果基本相同:

代码语言:javascript
复制
   CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-01 13:48:01

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4324937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档