2016-08-18 2 views
0

채팅 행을 삭제할 때 모든 메시지 행과 해당 id_chat으로 생성 된 모든 관계 행을 삭제하려고합니다. 이 시점에서 레지스터를 추가하는 데 문제가 없지만 릴레이션과 메시지 레지스터는 자동으로 사라지지 않으므로 삭제하는 데 문제가 없습니다.캐스케이드에서 삭제, FOREIGN KEY 제약 조건 오류, sqlite

public void onOpen(SQLiteDatabase db){ 
    super.onOpen(db); 
    db.execSQL("PRAGMA foreign_keys = ON"); 
} 

편집 : 그리고 지금 관계의 첫 번째 레지스터가 추가되었다 (1,17) I에 유래에서 읽을

public class DatabaseHelper extends SQLiteOpenHelper { 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE Chats (_id INTEGER PRIMARY KEY AUTOINCREMENT, A1 DATE)"); 
     db.execSQL("CREATE TABLE Messages (_id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(id_user) REFERENCES Users(id_user), FOREIGN KEY(id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)"); 
     db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE, FOREIGN KEY (id_viaje) REFERENCES Viajes(_id))"); 
     db.execSQL("CREATE TABLE Users (_id INTEGER AUTO_INCREMENT, id_user TEXT PRIMARY KEY, name TEXT)"); 
     db.execSQL("CREATE TABLE Viajes (_id INTEGER PRIMARY KEY AUTOINCREMENT, date DATE, activate BOOLEAN, id_user TEXT not null)"); 
    } 
} 

는 그래서 외래 키를 활성화하기 위해 방법 onOpen를 오버라이드 두 번째 것 (3,17)은 나에게 로컬 db에 오류를 준다 :

Error inserting id_viaje=3 id_chat=17 android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed 

왜이 오류가 발생 했습니까? 계단식에서 삭제하는 방법? 그래서 테이블 Relations에서이 외래 키 선언이 유효하지 않습니다 감사

답변

0

Chatsid_chat

라는 이름의 컬럼을 가지고 있지 않습니다

FOREIGN KEY (id_chat) REFERENCES Chats(id_chat) ON DELETE CASCADE 
             ^^^^^^^ 

질문은 "MySQL의"로 태그되어, 실제로 MySQL이 아닌 SQLite를 사용하고있는 것으로 보입니다. 이 둘 사이에는 몇 가지 차이점이 있습니다. 예를 들어 PRAGMA foreign keys은 MySQL에서는 유효하지 않습니다.

+0

네 말이 맞아. 내가 편집 했어. 감사. 관계에있는 레지스터를 생성하는 데 여전히 문제가있는 경우, 내가 작성한 모든 채팅은 관계에 최소한 2 개의 레지스터를 작성해야하며, 첫 번째 삽입 만 할 수 있습니다. – lulu666

0

내 해결책은 내 테이블 관계에서 외래 키로 id_viaje를 제거하는 것이 었습니다. 그냥 :

db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)"); 

계단식 작업에 대한 제약 조건 예외가 사라지고 삭제됩니다.

id_viaje id_chat과 id_chat 모두 내 서버의 외래 키이고 등록자를 추가 또는 삭제할 때 아무런 문제가 없으므로 이런 이유가 확실하지 않습니다.

관련 문제