Проблема со вставкой в ​​таблицу Android sqlite3, которая имеет составной первичный ключ - PullRequest
1 голос
/ 01 декабря 2010

У меня есть таблица с составным первичным ключом, и у меня возникают проблемы при вставке.Код, используемый для создания таблицы:

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 разных первичных ключа?

В моей таблице должно быть несколько разных событий для каждого идентификатора курса, но каждое событие должно быть уникальным для каждого курса.Мне нужно иметь возможность вставлять значения в таблицу, например:

EventName CourseId Назначение 1 60-415 Проект 1 60-415 Назначение2 60-415 Проект 2 60-415 Назначение 1 60-367 Проект 1 60-367

и так далее.Может кто-нибудь сказать мне, как я могу заставить это работать?Почему эти составные ПК не рассматриваются как уникальные записи?Любая помощь приветствуется.


Вот java-функция, которую я использую для вставки:

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

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

Может ли это быть причиной проблемы?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

У вас может быть составной первичный ключ в SQLite, но вы должны создать ключ при создании таблицы:

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

Нельзя создать первичный ключ после факта, используя ALTER TABLE.

С другой стороны, вы можете создать УНИКАЛЬНЫЙ ИНДЕКС после факта, который по сути имеет тот же эффект, что и ПЕРВИЧНЫЙ КЛЮЧ:

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

Я не уверен, как вы создали таблицы,и если вы добавили первичный индекс позже, но захватите базу данных на рабочий стол и посмотрите, как она работает в среде рабочего стола.

0 голосов
/ 01 декабря 2010

Вы не можете создавать такие комбинации, но они вам не нужны.Что мешает вам просто иметь действительно столбец идентификатора?

...