2010-12-01 8 views
1

複合プライマリキーを持つテーブルがあり、挿入に問題があります。テーブルを作成するために使用されるコードは次のとおりです。複合プライマリキーを持つアンドロイドsqlite3テーブルに挿入する際の問題

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 を:

Error: columns CourseId, EventName are not unique. 

と第二のインサートDOE:

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

を私は次のエラーを取得しますDBに入れないでください。このエラーはなぜ発生しますか?複合主キーでは、両方の値のの組み合わせが一意である必要があると考えました。上記の挿入では、CourseIdの値が同じであっても、EventName列の値が異なります。これは2つのユニークな組み合わせと2つの異なるプライマリキーとみなされるべきではありませんか?

私のテーブルはCourseIdごとにいくつかの異なるイベントを保持できる必要がありますが、各イベントは各コースごとに一意でなければなりません。

EVENTNAME CourseId 割り当て1 60から415 プロジェクト1 60から415 Assignment2 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(); 
} 

は、これが問題を引き起こしていませんか?

答えて

0

このような組み合わせはできませんが、必要はありません。本当にID列を持つだけで何が止まっていますか?

+0

お返事ありがとうございます。 ID列を使用したくないのは、同じコースの同じイベント名のエントリを必要としないからです。たとえば、60-415の代入1を2回入力することはできません。 –

+0

"代入1" + "#" + "イベント名"をIDとして持つことができます。あなたがどこかで区切り記号を忘れないようにcreateId(文字列代入、文字列イベント)のようなutil関数を持っていることを確認してください。EDIT:データを取得したら、lastIndexOf()/正規表現で区切ってください。 (lastIndexOfは簡単です) – somebody

+0

おそらくあなたはあまり理解していません。割り当て1はEventName、60〜415はCourseIdです。私は、この組み合わせをテーブルに複数回入力することを許可したくありません。しかし、それに対応する限り、Assignment 1はEventNameとして複数回入力することが許されていなければなりません。CourseIdは2つの列のユニークな組み合わせを作成します。また、60-415は、対応するEventNameが一意の組み合わせを作成する限り、CourseIdのエントリとして複数回許可する必要があります。 –

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

を私はあなたが作成しているか確認していない、テーブル、および後でプライマリインデックスを追加してデータベースをデスクトップに取り込み、デスクトップ環境での動作を確認してください。

+0

ありがとう、返信ありがとうございましたが、そのテーブルBのCとDのテーブルCの行Dのクエリが実行されます。私がテーブルを作ったのとまったく同じです。上記のテーブル作成スクリプトを正確に表示することができます。他のアイデア? –

+0

この場合、データはすでにテーブルに存在します。これらの2つのフィールドで順序を選択し、失敗したサンプルデータを含むセクションを投稿します。 – Pentium10

+0

上記の2つの挿入を実行した後、SELECT * FROM ClassEventを実行します。最初のレコードのみを返します。 2番目の挿入物はテーブルに挿入されません。 –

関連する問題