2012-06-01 2 views
0

SQLite 데이터베이스에서 작업하고 있습니다. 데이터베이스가 이미 채워져 있지만 리팩토링하고 싶습니다. 여기에 내가해야 할 일의 샘플입니다두 개의 테이블 분할 및 외래 키와 연결

내가 현재 가지고 하나의 테이블 :

CREATE TABLE Cars (ID INTEGER PRIMARY KEY, 
        Name VARCHAR(32), 
        TopSpeed FLOAT,     
        EngineCap FLOAT); 

내가 두 테이블에이를 분할 할 : 내가 만들 알아 낸

CREATE TABLE Vehicles (ID INTEGER PRIMARY KEY, 
         Name VARCHAR(32), 
         TopSpeed FLOAT); 

CREATE TABLE Cars (ID INTEGER PRIMARY KEY, 
        VehicleID INTEGER CONSTRAINT FK_Cars REFERENCES [Vehicles](ID),     
        EngineCap FLOAT);   

Cars 테이블 내용이있는 임시 테이블이고 Cars 테이블의 내용으로 Vehicles 테이블을 채울 수 있습니다.

하지만 난 여전히 이상 갈 수있는 방법을 찾고 있어요 같은 선택, 어떻게 든에 VehicleID 외래 키 필드에 넣어 Vehicles 테이블에서 해당 ID 값을 추출하는 새로운 Cars 테이블에 EngineCap 필드를 넣고 동안 Cars 테이블.

나는 대안이나 다른 접근법에 대해 공개하고 있습니다.

감사합니다.

+0

그냥 원하는 언급 - 비슷한 이름에도 불구하고,이 질문에 의해 답변을하지 않습니다. http://stackoverflow.com/questions/5312968/split-table-into-two-tables-with-foreign-keys –

+0

SQLite로 VARCHAR (32)를 생략 할 수 있습니다. 그것을 무시할 것입니다. 대신 TEXT를 사용합니다. – mateusza

답변

1

간단한 해결책 :

  • 는 당신이 VEHICLES_TEMP에서 가져온 VEHICLE_ID와
  • 업데이트 CARS을하지 않으려는
  • 는 차량 열없이 새 차 테이블을 만들 CAR_ID 포함 VEHICLES_TEMP 테이블을 생성 (확인
  • )를 CAR_ID하여 CAR_ID없이 최종 차량 테이블을 만들
+0

나는 이렇게 많은 것을 끝내었다. 이것을 시도하는 다른 누구에게나 한가지주의해야 할 점은 : 외래 키를 ON DELETE CASCADE로 설정했다면, VEHICLES_TEMP를 삭제할 때 CARS 테이블의 내용을 잃어 버릴 것입니다. CAR_ID 열을 제거 할 때주의하십시오. –

+0

좋은 점 ... SQlite가 전체 ALTER TABLE 문을 가지고 있다면 더 쉬울 것입니다 ... – andig

+0

사실,하지만 경량의 단일 파일 기반 데이터베이스 솔루션의 편의를 위해, 나는 2 년을 기다릴 용의가 있습니다 그 ALTER TABLE 문! –

0

테이블 New_CarsINSTEAD OF INSERT 트리거를 작성하십시오. 그러면 테이블 VehiclesCars에 데이터가 삽입됩니다. Cars에 삽입 할 때 함수를 사용하여 Vehicles 테이블에 삽입 된 행을 참조 할 수 있습니다.

임시 해결책이 될 수도 있고 추가 수정을 위해 데이터베이스에 남겨 둘 수도 있습니다.

트리거없이