SQLite id字段 - 自动填充

时间:2015-01-07 08:21:13

标签: ios objective-c sqlite fmdb

我在我的数据库中添加了一个新表:

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

现在的问题是如何插入数据以使该字段自动插入myId?我不确定我的插入代码是无效还是CREATE TABLE语句。

- 更新 -

我已更新create statement以更正一个:

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
);

2 个答案:

答案 0 :(得分:1)

关于您的评论,您需要在QUERY中指定PRIMARY KEY NULL值:

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

这样数据库就会填充主键并自动增加它(PRIMARY KEY的SQL Lite规范)。

答案 1 :(得分: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
);