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.

2番目の挿入は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();
}

これが問題を引き起こしている可能性はありますか?

4

2 に答える 2

2

SQLite では複合主キーを使用できますが、テーブルを作成するときにキーを作成する必要があります。

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

ALTER TABLE を使用して事後に主キーを作成することはできません。

一方、基本的に PRIMARY KEY と同じ効果を持つ UNIQUE INDEX を後で作成できます。

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

どのようにテーブルを作成したか、後でプライマリ インデックスを追加したかどうかはわかりませんが、データベースをデスクトップに取得し、デスクトップ環境でどのように機能するかを確認してください。

于 2010-12-01T13:50:33.610 に答える
0

そのような組み合わせはできませんが、必要ありません。本当に id 列を持つことを妨げているのは何ですか?

于 2010-12-01T13:48:01.063 に答える