2017-09-29 3 views
0

키 부모 삭제하면 아이의 키는 삭제되지 않습니다나는 다음과 같은 SQLite는을 통해 데이터베이스를 만든

enter image description here

내가 이런 books로 불리는 테이블을 만들었을 :

CREATE TABLE books (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "title-book" TEXT, witer TEXT, comment TEXT, "intro-img" TEXT, "avalable-count" integer, "total-count" integer, "publisher-id" INTEGER REFERENCES publisher (id) ON DELETE CASCADE ON UPDATE CASCADE, "category-id" INTEGER REFERENCES categories (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY ("publisher-id") REFERENCES publisher (id) ON DELETE CASCADE ON UPDATE CASCADE); 

나는 그때 카테고리 제거하지 않았다는 것을 포함 아이 키 행을 가진 책 테이블을보고 그들이 있었다으로 followi처럼 존재하는 책 category-id에 대한 부모의 키가 범주를 삭제하면 NG 사진 :

enter image description here enter image description here

+0

검사보다 최신 3.6.9 및 사용이 외래 키가 있습니다. 또한 "PRAGMA foreign_keys"명령은 지원되는 경우 "데이터 없음"대신 0 또는 1을 반환해야합니다. 에 대한 자세한 정보 : https://sqlite.org/foreignkeys.html – LordNeo

+0

나는이 코드를 시도 : PRAGMA foreign_keys; 그리고 그것은 0을 반환하고, 나는이 코드를 사용한다 : PRAGMA foreign_keys = ON; 확실히 그것이 가능하다는 것을 의미합니다 –

+0

0은 지원되지만, (기본적으로) 비활성화됨을 의미하므로,이를 활성화하고 다시 테스트하십시오. 또한, 각 연결에 대해서도 이것을 활성화시켜야합니다.'외래 키 제약 조건은 기본적으로 (하위 호환성을 위해) 비활성화되어 있으므로 각 데이터베이스 연결마다 별도로 활성화해야합니다. ' – LordNeo

답변

1

SQLite는 3.6.19 및 외래 키를 지원하지 않는 구형. 새 버전이있는 경우 사용 지원을 확인할 수 있습니다

PRAGMA foreign_keys 

가 반환하는 경우 "자료 없음"반환 하면서, (가 SQLITE_OMIT_FOREIGN_KEY 또는 SQLITE_OMIT_TRIGGER 정의 컴파일 되었기 때문에) 설치는 지원이 없음을 의미 0은 "지원되지만 비활성화 됨"을 의미합니다. (기본값) 및 1은 "지원 및 사용"을 의미합니다..

당신은

PRAGMA foreign_keys = ON; 

이이 모든 데이터베이스 연결을 활성화해야합니다주의 사용하여 런타임에 사용할 수 있습니다 :

외래 키 제약 (이전 버전과의 호환성을 위해) 기본적으로 비활성화되어, 그렇게해야합니다 각 데이터베이스 연결마다 별도로 사용할 수 있습니다.

또한 고려 : 활성화하거나 (SQLite는이 자동 커밋 모드에 있지 않을 때) 다중 문 트랜잭션의 중간에 외래 키 제약 조건을 비활성화 할 수 없습니다

. 그렇게하려고해도 오류는 반환되지 않습니다. 단순히 효과가 없습니다.

참조 : 당신의 SQLite는 버전이 https://sqlite.org/foreignkeys.html

+0

그게 효과가 있습니다! PRAGMA foreign_keys = ON; 내 문제는 PRAGMA foreign_keys가 비활성화되었습니다. 내 질문이이 하나에 변경 매 시간마다해야 할 경우이 프로젝트를 고객에게 보내겠다고 가정합니다. PRAGMA foreign_keys = ON; 이 코드는 어떻게 고객에게이 작업을 요청할 수 있습니까?! 다른 데이터베이스에서 데이터베이스를 올바르게 작동시키고 싶습니다. 어떻게해야합니까?! –

+0

초기 데이터베이스 연결을 설정하는 설정 파일이 있다면 거기에 추가 할 수 있으므로 db 연결이 시작될 때마다 호출됩니다 – LordNeo