Оператор вставки не проверяет наличие дублирующихся значений - PullRequest
0 голосов
/ 28 августа 2011

Я пытаюсь предотвратить дублирование записей в моей базе данных sqlite с помощью уникального идентификатора при создании таблицы.Информация, включая первичный ключ, вставляется через некоторые данные json, возвращаемые веб-службой.

Хотя я понимаю, что не следует использовать автоматически сгенерированный первичный ключ, это необходимо для бизнес-модели.

Если случайно веб-служба вернет запись, которая уже существует, вы предполагаете, что она не будет вставлять данные снова, но выдаст ошибку.Это не тот случай.

Кто-нибудь знает способ предотвратить это?

Заявление о создании

CREATE TABLE "Data" ("Id" INTEGER PRIMARY KEY NOT NULL UNIQUE , "DataText" TEXT NOT NULL , "CategoryId" INTEGER NOT NULL )

Введите код

if (sqlite3_open([[self getDatabaseConnection] UTF8String], &database) == SQLITE_OK)
    {        
        const char *sql = "INSERT INTO Data (Id, CategoryId, DataText) Values(?, ?, ?)";
        if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
        {
            NSLog(@"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }
        else
        {
            sqlite3_bind_int64(addStatement, 1, dataId);
            sqlite3_bind_int64(addStatement, 2, categoryId);
            sqlite3_bind_text(addStatement, 3, [dataText UTF8String], -1, SQLITE_TRANSIENT);

            if(SQLITE_DONE != sqlite3_step(addStatement))
            {
                NSLog(@"Error while inserting data. '%s'", sqlite3_errmsg(database), nil);
            }
        }
        //Reset the add statement.
        sqlite3_reset(addStatement);
    }
    sqlite3_close(database);

1 Ответ

2 голосов
/ 28 августа 2011

Допустим, у вас есть таблица с именем PRODUCTS, и она содержит это значение:

               ProductID|ProductName
               50|widget

ProductID - первичный ключ.

Если у вас нет уникального индекса для [productname], вы можетевставьте эту запись:

              60|widget

Но даже если у вас не было уникального индекса по имени продукта, вы не могли вставить дополнительные записи с продуктом 50, независимо от того, какое название продукта произошло, потому чтострока со значением первичного ключа 50 уже существует.

ADDENDUM:

Теперь предположим, что вы хотели принять несколько экземпляров «виджета», но не в одной категории.Вы могли бы иметь «виджет крыши» и «виджет пола».В этом случае, в дополнение к уникальному ограничению первичного ключа в столбце целочисленного идентификатора, вы можете наложить уникальное ограничение на этот альтернативный составной ключ: (productname, categoryid).

ADDENDUM2:

INTEGER PRIMARY KEY должно хватить.Вы не должны нуждаться в NULL UNIQUE.http://www.sqlite.org/lang_createtable.html#rowid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...