2013-06-09 2 views
3

첫 번째 4에 삽입 된 몇 개의 레코드로 정의 된 다음 5 개의 테이블이 있습니다. 이것은 sqlite 3.7.1.7을 외래 키로 사용할 수 있습니다. 관련없는 레코드에 대한 삭제 명령에서 외래 키 불일치가 있음

create table if not exists subject (id varchar(50) primary key,desc varchar(100)); 
insert into subject (id,desc) values ("subject1","test subject"); 

create table if not exists subjectlevel (id_subject_id varchar(50) references subject(id) on delete cascade, id integer not null, desc varchar(100) not null, questmcmaxselections integer not null, primary key (id_subject_id,id)); 

insert into subjectlevel (id_subject_id,id,desc,questmcmaxselections) values ("subject1",1,"test subject1 level 1",4); 

insert into subjectlevel (id_subject_id,id,desc,questmcmaxselections) values ("subject1",2,"test subject1 level 2",4); 

create table if not exists questmc (id integer primary key, text varchar(300) not null, includeallanswers int not null, subject_id varchar(50), subjectlevel_id integer, foreign key (subject_id, subjectlevel_id) references subjectlevel (id_subject_id,id) on delete cascade); 

insert into questmc (text,includeallanswers,subject_id,subjectlevel_id) values ("this is a _ question", 1, "subject1",1); 

create table if not exists questmcselection (id integer primary key, text varchar(100) not null, subject_id varchar(50), subjectlevel_id integer, foreign key (subject_id, subjectlevel_id) references subjectlevel (id_subject_id,id) on delete cascade); 

insert into questmcselection (text,subject_id,subjectlevel_id) values ("this is a solution","subject1",1); 

create table if not exists questmc_questmcselection(id integer primary key, answer integer not null, questmc_id integer, questmcselection_id integer, subject_id varchar(50), subjectlevel_id integer, foreign key (questmc_id) references questmc(id) on delete cascade, foreign key (questmcselection_id) references questmcselection (id) on delete cascade, foreign key (subject_id,subjectlevel_id) references questmc (subject_id,subjectlevel_id) on delete cascade, foreign key (subject_id,subjectlevel_id) references questmcselection (subject_id,subjectlevel_id)); 

내가 subjectlevel 테이블에 두 번째 레코드를 삭제하려고하면

, 내가 한 테이블 questmc_questmcselection가 정의되어 외부 키 불일치 오류가 발생합니다.

sqlite> delete from subjectlevel where id=2; 
Error: foreign key mismatch - "questmc_questmcselection" referencing "questmcselection" 

questmc, questmcselection 및 questmc_questmcselection이 삭제를 방지해야 더 관련 기존 레코드가 없습니다. 이 오류가 발생하는 이유는 무엇입니까?

+0

지난 2 외래 키를 좋아하지 보인다 questmc_questmcselection 테이블에 정의되어 있습니다. 마지막으로 하나를 제거한 다음 두 번째 (subject_id, subjectlevel_id) 키를 모두 삭제했습니다. 따라서 "sqlite 3.7.1.7이 같은 테이블에 여러 개의 외래 키 링크를 지원합니까? – rss181919

+0

아마도 내가 더 큰 그림 질문을해야합니다. 나는 여러 가지 선택 (mc) 질문 표 및 질문을 통해 재사용 할 수있는 옵션을 보유한 선택 표가 있습니다. 나는 그들 사이의 n : n 링크가 필요합니다. 그러나 질문과 선택 기록 모두 주제 and subjectlevel defined. n : n 연결을 통해 동일한 유형의 연결 만 허용 할 수 있는지 확인해야합니다. – rss181919

답변

2

이 오류는이 특정 subjectlevel 레코드와 관련이 없습니다.

테이블에 the required indexes이 없다는 것이 문제입니다. DELETE 문이 SQLite에서 데이터베이스 스키마의 일관성을 검사해야하는 첫 번째 명령 이었기 때문에 이전에보고되지 않았습니다. CL의 답변에 따라

+0

SQLite를 처음 사용하고 SQL을 처음 사용했습니다.이 작업을 수행하는 데 필요한 인덱스는 무엇입니까? ? – rss181919

+0

DB 레벨에서 가능한 일이 가능한지 모르겠다. 테이블 A에는 id와 타입 필드가있다 .B 테이블에는 id와 타입 필드가있다. 두 경우 모두 id가 기본 키이고 유형에는 다음과 같은 값이 있습니다. e 동일한 값 세트. 테이블 C는 A와 B 사이에 n : n 링크를 제공합니다. 그러나 레코드 A와 B가 같은 유형 인 경우에만 링크가 필요합니다. – rss181919

+1

CL의 도움을 받아 제공됩니다. 테이블 A와 B는 키에 id와 type을 포함해야합니다. 이것은 CL이 언급 한 고유 색인입니다. 표 C는 다음과 같이 3 개의 필드 (원조, 입찰, 유형)와 2 개의 fkey 제약을 포함해야한다. 외부 키 (보조, 유형) 참조 A (ID, 유형), 외부 키 (입찰 유형) 참조 B (ID, 유형) 이렇게하면 공유하는 경우에만 A와 B의 두 레코드를 테이블 C에 연결할 수 있습니다 같은 형태의 값 도움 CL에 감사드립니다. – rss181919

0

-

sqlite> create table parent(a); 
sqlite> create table child(a, FOREIGN KEY (a) REFERENCES parent(a)); 
sqlite> pragma foreign_keys = ON; 
sqlite> insert into parent values(3); 
sqlite> insert into child values (3); 
Error: foreign key mismatch - "child" referencing "parent" 
sqlite> create unique index p_a on parent(a); 
sqlite> insert into child values (3); 
sqlite> _ 

문서에서 :

는 일반적으로 외래 키 제약 조건의 상위 키는 부모 테이블의 기본 키 입니다. [NOT] 인 경우 부모 키 열은 일 수 있고 UNIQUE 제약 조건을 갖거나 또는 부모 테이블에 대한 CREATE TABLE 문에 일기 순서 ... UNIQUE 인덱스가 있어야합니다. 대안 즉

은 다음과 같습니다

sqlite> create table parent(a, b, UNIQUE (a, b)); 
sqlite> create table child (x, y, FOREIGN KEY (x, y) REFERENCES parent(a, b)); 

(이것은 또한 다중 열 외래 키를 강조, 그들은 너무 인덱스 작업 ...)