2013-04-19 1 views
1

SQLite foreign key documentation을 기반으로 두 데이터베이스를 만드는 방법이어야하며 부모 필드를 참조하는 필드는 부모 필드가 업데이트되면 업데이트됩니다.SQLITE ON UPDATE 작업

문제 : 마지막 명령 SELECT * FROM track;까지 결과가 여전히 다음과 같이 동일하게 유지되므로 마지막 단계의 결과로 변경되어야하므로 모든 단계가 정상적으로 작동합니다.

trackid trackname   trackartist 
    ------- ----------------- ----------- 
    11  That's Amore  1 
    12  Christmas Blues 1 
    13  My Way    2 

코딩 :

-- Database schema 
CREATE TABLE artist(
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
); 
CREATE TABLE track(
    trackid  INTEGER, 
    trackname TEXT, 
    trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE 
); 

sqlite> SELECT * FROM artist; 
artistid artistname  
-------- ----------------- 
1   Dean Martin  
2   Frank Sinatra  

sqlite> SELECT * FROM track; 
trackid trackname   trackartist 
------- ----------------- ----------- 
11  That's Amore  1 
12  Christmas Blues 1 
13  My Way    2 

sqlite> -- Update the artistid column of the artist record for "Dean Martin". 
sqlite> -- Normally, this would raise a constraint, as it would orphan the two 
sqlite> -- dependent records in the track table. However, the ON UPDATE CASCADE clause 
sqlite> -- attached to the foreign key definition causes the update to "cascade" 
sqlite> -- to the child table, preventing the foreign key constraint violation. 
sqlite> UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin'; 

sqlite> SELECT * FROM artist; 
artistid artistname  
-------- ----------------- 
2   Frank Sinatra  
100  Dean Martin  

sqlite> SELECT * FROM track; 
trackid trackname   trackartist 
------- ----------------- ----------- 
11  That's Amore  100 
12  Christmas Blues 100 
13  My Way    2 

는 왜입니까?

답변

1

당신은 더 조심 fine manual을 읽어야 할 사람 :

2. 활성화 외래 키 지원 라이브러리를 가정
[...]
가 외래 키 제약 조건이 활성화 컴파일, 아직해야 PRAGMA foreign_keys 명령을 사용하여 런타임에 응용 프로그램에서 사용 가능하게하십시오. 예를 들어 :

sqlite> PRAGMA foreign_keys = ON; 

외래 키 제약 (이전 버전과의 호환성을 위해) 기본적으로 비활성화되어 있으므로 별도로 각 데이터베이스 연결에 대해 개별적으로 활성화해야합니다.

이 말을 그래서 경우 :

sqlite> PRAGMA foreign_keys = ON; 
sqlite> UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin'; 

다음 당신은 당신이 기다리고있어 track에서 100 단위를 볼 수 있습니다. 물론 SQLite가 FK 지원으로 컴파일되었다고 가정합니다.