2015-01-07 164 views
0

我添加了一个新的表到我的DB:SQLite的ID字段 - 自动填充

CREATE TABLE myTable (
myId ID NOT NULL, 
aNumber INTEGER NOT NULL, 
anUniqueTextId TEXT NOT NULL, 
aText TEXT, 
PRIMARY KEY(myId, anUniqueTextId) ON CONFLICT IGNORE, 
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE 
); 

现在我想无需手动找出哪些索引中插入值应我把myId领域:

[myDatabase inTransaction:^(FMDatabase *db, BOOL *rollback) { 
     [db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?)", 
//   @(myData.myId), //I don't want to insert it manually 
     @(aNumber), 
     myData.anUniqueTextId, 
     myData.aText]; 

     if (db.lastErrorCode) { 
      NSLog(@"Huston, we've got a problem: %@", db.lastError.localizedDescription); 
     } 
}]; 

OFC,我来到这里的错误说服力:

table myTable has 4 columns but 3 values were supplied 

现在的问题是如何将数据插入到m ake这个字段autoinsert myId?我不确定我的插入代码是无效的还是CREATE TABLE语句。

- 更新 -

我更新的创建语句来纠正一个:

CREATE TABLE myTable (
myId INTEGER PRIMARY KEY DEFAULT 0 NOT NULL, 
aNumber INTEGER NOT NULL, 
anUniqueTextId TEXT NOT NULL, 
aText TEXT, 
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE 
); 

回答

1

关于你的评论,你需要在查询一个NULL值指定PRIMARY KEY

[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?,?)", 
    NULL, 
    @(aNumber), 
    myData.anUniqueTextId, 
    myData.aText]; 

这样的数据库将在填主键和自动增量(SQL Lite规范PRIMARY KEY)。

+0

这不适用于FMDB,它在类中的某处崩溃。 – Hemang

0

在这里,你需要改变表的模式。

要自动插入到myId字段中,必须在创建表时添加约束条件AUTOINCREMENT。此外,该字段必须用作主键。所以,现在的表中的模式是这样的:

CREATE TABLE myTable (
myId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL 
aNumber INTEGER NOT NULL, 
anUniqueTextId TEXT NOT NULL, 
aText TEXT, 
FOREIGN KEY(anUniqueTextId, aNumber) REFERENCES otherTable(otherTableId, otherTableValue2) ON DELETE CASCADE 
); 
+1

我发现代码存在一些问题。首先,有两个主键,所以这个'PRIMARY KEY(myId,anUniqueTextId)ON CONFLICT IGNORE'应该被删除。休息是创造声明是好的。 AUTOINCREMENT速度较慢,“如果不是非常需要,应该避免”。 “在INSERT上,如果ROWID或INTEGER PRIMARY KEY列没有明确给出值,那么它会自动填充一个未使用的整数,通常是比当前使用的最大ROWID多一个。不使用AUTOINCREMENT关键字 “。 AUTOINCREMENT只是禁止重复使用ROWID。 – Vive

+0

表中可以有多个主键。如果您使用AUTOINCREMENT,则在表中插入记录时,不需要提供字段。 – Kampai

+1

如果您不使用AUTOINCREMENT,则在插入时也不需要提供值(来源:https://www.sqlite.org/autoinc.html)。我找到了解决方案,当我仅向INSERT语句添加NULL时,一切工作正常。没有AUTOINCREMENT。您可以有1个主键,但它可以来自多个列。在你的(和我的)代码中有两个主键:'myId INTEGER PRIMARY KEY'和'PRIMARY KEY(myId,anUniqueTextId)'。这是无效的。 – Vive