2012-06-01 87 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表內容的臨時表,我可以填寫Vehicles表與Cars表的內容:

CREATE TEMPORARY TABLE Cars_temp AS SELECT * FROM Cars; 

INSERT INTO Vehicles (Name, TopSpeed) 
SELECT Name, TopSpeed FROM Cars_temp; 

但我仍然在尋找一種方式去在同樣的選擇,而把EngineCap場到新Cars表和不知何故從Vehicles表中提取相應的ID值裝進VehicleID外鍵字段上Cars表。

我打開了解決方法或替代方法。

謝謝。

+0

只想提及 - 儘管類似的名字,這個問題是沒有回答http://stackoverflow.com/questions/5312968/split-table-into-two-tables-with-foreign-keys –

+0

你可以省略VARCHAR(32)作爲SQLite會忽略它。我會用TEXT來代替。 – mateusza

回答

1

沒有觸發簡單的解決方案:

  • 創建VEHICLES_TEMP表包括CAR_ID
  • 創建新的CARS表沒有車輛列你不想
  • 從VEHICLES_TEMP採取VEHICLE_ID更新CARS(標識由CAR_ID)
  • 創建最終VEHICLES表沒有CAR_ID
+0

我最終做了非常像這樣的事情。對於其他人來說,只需要注意一點:如果你的外鍵設置爲「ON DELETE CASCADE」,那麼在刪除VEHICLES_TEMP時將會丟失CARS表的內容。所以在移除CAR_ID列時要小心。 –

+0

好的......如果SQlite有一個完整的ALTER TABLE語句,當然會更容易...... – andig

+0

沒錯,但是爲了方便這種基於輕量級單個文件的數據庫解決方案,我願意等幾年那個ALTER TABLE語句! –

0

創建一個表New_Cars和一個INSTEAD OF INSERT觸發器,它會將數據插入表VehiclesCars。當插入到Cars時,可以使用last_insert_rowid()函數來參照Vehicles表中插入的行。

這可能是臨時解決方案,或者您可以將其留在數據庫中作進一步修改。