我正在试图找出向新字段添加(不同)guid的最快方法,其中可能有数千条记录。
我很确定SQLite不提供会创建guid的函数。所以我需要以某种方式为每一行创建这个。
我想出的想法做得很远。
只需执行更新查询,其中字段为空并且限制1.显然,即使在交易中,这也会很慢。
将cte(公用表扩展名)与临时表一起使用,我建立了包括guid,update / join在内的值。但是我似乎无法在iOS中使用临时表,我不断得到一个名为乱序错误的库。
对更新查询使用内联子查询。但是我不知道如何识别需要guid的行,除了它们是空白的。我需要使用递归,再次需要cte,我相信?
void newguid(sqlite3_context *context, int argc, sqlite3_value **argv)
{
if (argc != 1 || sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
sqlite3_result_null(context);
return;
}
@autoreleasepool {
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
CFRelease(uuid);
sqlite3_result_text(context, [uuidString UTF8String], -1, SQLITE_TRANSIENT);
}
}
- (void)createSqlGuidFunction:(sqlite3*)db
{
if (sqlite3_create_function_v2(db, "newguid", 1, SQLITE_ANY, NULL, &newguid, NULL, NULL, NULL) != SQLITE_OK)
{
NSLog(@"%s: sqlite3_create_function_v2 error: %s", __FUNCTION__, sqlite3_errmsg(db));
}
}
答案 0 :(得分:1)
应用程序可以使用此函数以及hex()和/或lower()生成全局唯一标识符,如下所示:
hex(randomblob(16)) lower(hex(randomblob(16)))
但是如果你想使用不同的机制来生成GUID,你可以register your own function。
答案 1 :(得分:0)
我建议做这样的事情
ALTER TABLE newTable RENAME TO oldTable;
CREATE TABLE newTable (//Define your columns here along with the GUID column);
然后,您可以从oldTable中选择所有值,并将其与GUID一起插入newTable。完成后,请使用
DROP TABLE oldTable