2011-09-24 3 views
5

SQLITE3에서 one to many를 만드는 방법은 무엇입니까? 내가 2 개 테이블이 있습니다SQLITE3에서 one to many를 만드는 방법?

Mans: 
_id name 
1 antony 
2 fred 

point 
_id date point 
1  23  77 
     24  99 

2  25  78 
     5  0 

나는, 나를 도와, SQL 구문을하시기 바랍니다 모르겠어요.

+0

두 번째 테이블이 그런 것 같지 않습니다 -이 SQL 테이블이나 입력 할 데이터가 있습니까? – Mark

+0

그게 두 번째 테이블 –

답변

3

이의 구문은 다음과 같다 ....

CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE 

는 여기에 +

http://sqlite.org/foreignkeys.html

+0

illin 새우 - skrillin 악당 : 내 대답을 확인 했습니까? –

11

에 의해가는 문서이다 v3.6.1에서 작동 무엇 illin의 shrimp- iamkrillin skrillin villain :

CREATE TABLE (points) points_id INT 
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField) 
ON DELETE CASCASDE ON UPDATE CASCASDE 

실제의 예입니다. 직원, 친구, 광고를하는 지역 비즈니스 등 비즈니스를 추천하는 사람들이 있다고 가정 해 보겠습니다. 들어오는 고객을 '추천'비즈니스라고합니다. 각 사람은 하나의 참조로만 계산되지만 참조자는 많은 추천을 참조 할 수 있습니다 (예 : 직원이 20 명의 신규 고객을 참조 할 수 있으며 직원은 리퍼러이고 직원은 20 명의 추천을 작성한 경우). 그래서, 당신은 1 리퍼러 20 referals (일대)이 ​​: 이제

CREATE TABLE referal(           
    referal_id INTEGER UNIQUE NOT NULL PRIMARY KEY,   //A customer can only be 1 referal. 
    referal_method TEXT,          //How were they refered? By phone? 
    referer_id INTEGER ,          //Who refered them? 
    FOREIGN KEY(referer_id) REFERENCES referer(referer_id)); //Trace more about referer. 

를, 둘 이상의 사람이 referal을 의미하는 것이 가능하지만, 난 단지 보상에 표준 사업 관행이라고 생각 단 하나의 referer. 따라서 두 명의 리퍼러를 나열 할 필요가 없습니다. 이것은 항상 일대일 또는 일 대 다 관계 일 것입니다. 따라서 1 대 다수 테이블로 만들어야합니다. 캐스케이드에 능숙하지는 않지만 그게 어울리는 지 파악하려고 노력할 것입니다.

언뜻보기에 ON UPDATE CASCADE ON DELETE CASCADE은 내 대답에 포함되지 않습니다. 마지막 참조를 제거하면 참조자가 제거되지 않아야합니다.

a different example에서 상대 : 당신이 hard_candy 테이블에서 하드 캔디를 삭제하면

CREATE TABLE all_candy 
    (candy_num SERIAL PRIMARY KEY, 
    candy_maker CHAR(25)); 

CREATE TABLE hard_candy 
    (candy_num INT, 
    candy_flavor CHAR(20), 
    FOREIGN KEY (candy_num) REFERENCES all_candy 
    ON DELETE CASCADE) 

는, 당신은 또한 all_candy 테이블에서 삭제되는 하드 캔디 사탕의 일종이기 때문에, 그리고 입력하는 경우 캔디가 변경된 경우 (예 : 중단 된 사탕) 새 INSERT 명령을 실행해야합니다.

sqlite3에서 ON UPDATE CASCADE 및 ON UPDATE DELETE에 대한 테스트 케이스를 실행했는데 아무 효과가없는 것 같습니다. 아마도 sqlite3의 기본 db 엔진에서는 작동하지 않지만 공식 SQLite 웹 사이트에 나열된 기능은 a very descriptive, easy-to-follow example of ON UPDATE CASCADE by sqlite.org입니다. 읽고 생각 해보세요.

이 내 테스트 케이스에 사용되는 스키마는 다음과 같습니다

BEGIN TRANSACTION; 
CREATE TABLE candy(id integer primary key not null, name text, description text); 
INSERT INTO candy VALUES(1,'Laffy Taffy', 'Delicious, soft candy.'); 
INSERT INTO candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.'); 
COMMIT; 

BEGIN TRANSACTION; 
CREATE TABLE hard_candy(id integer primary key not null, name text, description text, foreign key(id,name,description) references hard_candy ON DELETE CASCADE ON UPDATE CASCADE); 
INSERT INTO hard_candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.'); 
COMMIT; 

어느 테이블의 ID-2 설명 필드에 다양한 업데이트를 달렸다.

관련 문제