SQLite id 字段 - 自动填充
SQLite id field - autofill
我在我的数据库中添加了一个新的 table:
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 语句以更正一个:
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
);
此处您需要更改 table 的架构。
要自动插入 myId
字段,您必须在创建 table 时添加约束 AUTOINCREMENT
。此字段也必须用作主键。所以现在 table 的架构如下:
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
);
关于您的评论,您需要在 QUERY 中指定 PRIMARY KEY
和 NULL
值:
[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?,?)",
NULL,
@(aNumber),
myData.anUniqueTextId,
myData.aText];
这样数据库将填充主键并自动增加它(SQL PRIMARY KEY
的精简规范)。
我在我的数据库中添加了一个新的 table:
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 语句以更正一个:
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
);
此处您需要更改 table 的架构。
要自动插入 myId
字段,您必须在创建 table 时添加约束 AUTOINCREMENT
。此字段也必须用作主键。所以现在 table 的架构如下:
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
);
关于您的评论,您需要在 QUERY 中指定 PRIMARY KEY
和 NULL
值:
[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?,?)",
NULL,
@(aNumber),
myData.anUniqueTextId,
myData.aText];
这样数据库将填充主键并自动增加它(SQL PRIMARY KEY
的精简规范)。