2015-01-07 6 views
0

내가 내 DB에 새 테이블을 추가했습니다 :SQLite는 id 필드 - 자동 완성

[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); 
     } 
}]; 
:

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 필드에 넣어

년 OFC, 나는 여기에 오류 텔링을 얻을 :

table myTable has 4 columns but 3 values were supplied 

이제 문제는 m에 데이터를 삽입하는 방법입니다 이 필드 자동 삽입 myId? 내 삽입 코드가 잘못되었거나 CREATE TABLE 문이 맞는지 잘 모르겠습니다.

- UPDATE - 나는 하나를 해결하기 위해 문을 만들고 업데이트되었습니다

: 여기

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

:처럼 이제 테이블에 대한 스키마는

[db executeUpdate:@"INSERT INTO myTable VALUES(?,?,?,?)", 
    NULL, 
    @(aNumber), 
    myData.anUniqueTextId, 
    myData.aText]; 
데이터베이스가 채 웁니다

그 방법 기본 키 및 autoincrement 그것 (SQL 라이트 사양에 대한 PRIMARY KEY).

+0

이것은 FMDB에서 작동하지 않습니다. 클래스의 어딘가에서 충돌합니다. – Hemang

0

당신은 테이블의 스키마를 변경해야합니다.

myId 필드에 자동 삽입하려면 테이블을 만들 때 제약 조건 AUTOINCREMENT을 추가해야합니다. 또한이 필드는 기본 키로 사용해야합니다. 쿼리에 NULL 값으로 PRIMARY KEY을 지정해야합니다 귀하의 코멘트에 대하여

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

코드와 관련된 몇 가지 문제점을 발견했습니다. 첫째, 2 개의 기본 키가 있으므로이 'PRIMARY KEY (myId, anUniqueTextId) on CONFLICT IGNORE'가 삭제되어야합니다. 나머지는 create 문 중 ok입니다. 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) '의 2 개의 기본 키가 있습니다. 유효하지 않습니다. – Vive