2015-01-07 207 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