2012-07-03 3 views
0

원래 합성/외래 키로 설계된 SQLite 데이터베이스 스키마에서 작업 중이며 대신 대리 키를 사용하도록 변경하려고합니다. 서로 게이트 키에 대한 새 열을 쉽게 만들 수 있었지만 이제는 대용 키를 부모 테이블에 다시 연결해야합니다.이를 수행하는 가장 좋은 방법은 무엇입니까?복합 외래 키를 사용하여 데이터베이스에 대리 키를 만드는 방법은 무엇입니까?

올드 스키마 발췌 :

CREATE TABLE "parent" (
    "caseid" TEXT NOT NULL, 
    "issueid" INTEGER NOT NULL, 
    "data" TEXT, 
    PRIMARY KEY("caseid", "issueid") 
) 

CREATE TABLE "child" (
    "caseid" TEXT NOT NULL, 
    "issueid" INTEGER NOT NULL, 
    "childdata" TEXT, 
    FOREIGN KEY("caseid", "issueid") REFERENCES parent("caseid", "issueid") 
) 

새로운 스키마 발췌 :

CREATE TABLE "parent" (
    "id"  INTEGER PRIMARY KEY, 
    "caseid" TEXT NOT NULL, 
    "issueid" INTEGER NOT NULL, 
    "data" TEXT 
) 

CREATE TABLE "child" (
    "id"  INTEGER PRIMARY KEY, 
    "childdata" TEXT, 
    "parent_id" INTEGER REFERENCES parent("id") 
) 

내 질문은, 원래 자식 테이블의 데이터로 새로운 자식 테이블을 작성 후 내가 어떻게 채울 않는 한 "parent_id"필드는 현재 복합 외래 키가 아닌 대리 키입니다. SQL 명령으로이를 수행하는 쉬운 방법이 있습니까?

답변

2

먼저 이전 caseid + issueid 열을 제거 (아직) 새로운 id 열을 추가하여 child 테이블을 변경할 수 있지만 : 의미있는 값을

CREATE TABLE "parent" (
    "id"  INTEGER PRIMARY KEY, 
    "caseid" TEXT NOT NULL, 
    "issueid" INTEGER NOT NULL, 
    "data" TEXT 
); 

CREATE TABLE "child" (
    "id"  INTEGER PRIMARY KEY, 
    "caseid" TEXT NOT NULL, 
    "issueid" INTEGER NOT NULL, 
    "childdata" TEXT, 
    "parent_id" INTEGER REFERENCES parent("id") 
); 

업데이트 child.parent_id :

UPDATE child 
SET parent_id = (
    SELECT parent.id 
    FROM parent 
    WHERE parent.caseid = child.caseid 
    AND parent.issueid = child.issueid 
); 

을 지금 childcaseid/issueid 열을 안전하게 삭제할 수 있습니다.

+0

고마워요! 비슷한 솔루션으로 수렴했지만 select 문으로 행을 업데이트하는 방법을 잠시 잊어 버렸습니다. (또한 너무 나쁜 SQLite 열을 직접 삭제할 수 없습니다 - 여분의 열을 삭제하려면 새 데이터를 통해 테이블을 복사 할 추가 단계를 수행해야하지만 그렇지 않으면 완벽하게 작동합니다) –

+0

CREATE TEMPORARY VIEW '필요한 경우 전체 표 사본을 하나만 사용할 수 있습니다. :) – biziclop

관련 문제