2013-03-19 37 views
1

我有一個最初使用SQLite開發的小型數據庫。當用戶最初啓動應用程序時,我的桌面應用程序會自動設置數據庫表。如何在初始數據庫設置期間爲不存在的表創建FOREIGN KEYS?

問題 幾個表都有FOREIGN KEY約束。假設我有表A,表B和表C. A有一個外鍵約束與C.但是當我做初始表生成,SQLException的每次都拋說是這樣的:

約束「SQL130319142644383」無效:引用表 PREDICTIONRUN不存在。

(注:我不能簡單地因爲重組等國外關鍵問題表)

那麼,如何創建與國外KEY約束的表?

if (! this.checkIfTableExists("DocumentClassification", conn)) { 
       sql.setLength(0) ; 
       sql.append("CREATE TABLE DocumentClassification ( ") ; 
       if (dbtype.equalsIgnoreCase("javadb")) { 
        sql.append(" classificationid INTEGER PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) , ") ; 

       } else { 
        sql.append(" classificationid INTEGER PRIMARY KEY, ") ; 
       } 
       sql.append("  classid INTEGER, ") ; 
       sql.append("  documentid INTEGER, ") ; 
       sql.append("  predictionrunid INTEGER, ") ; 

       sql.append("  matterid VARCHAR(512), ") ; 
       sql.append("  datereadable VARCHAR(2048), ") ; 
       sql.append("  date BIGINT, ") ; 
       sql.append("  note VARCHAR(" + maxint + "), ") ; 
       sql.append("  FOREIGN KEY (classid) REFERENCES Classes (ClassID),") ; 
       sql.append("  FOREIGN KEY (documentid) REFERENCES MatterDataset (id), ") ; 
       sql.append("  FOREIGN KEY (predictionrunid) REFERENCES PredictionRun (predictionrunid)") ; 
       sql.append(" ) ") ; 
       // Create the table 
       sqlstatement.executeUpdate(sql.toString()); 
      } 

數據庫中使用 用於JavaDB /德比 SQLite的(通過Xerial駕駛員)(這裏沒有問題,因爲SQLite的似乎並沒有強制執行創建約束)

發展 Java 7

回答

4

假設我有表A,表B和表C. A具有與C的外鍵約束

的簡單的解決方案是表A之前創建表C

在有些情況是你不能:例如,有兩個表有外鍵的表。這些情況相當不尋常。如果遇到問題,則可以創建沒有外鍵的表。創建所有表之後,你就可以alter table的外鍵:

alter table YourTable add constraint FK_YourTable_Column1 
    foreign key references OtherTable(Column1) 
+0

當然,如果你有一個有外鍵對方比你有一個需要設計問題表要解決的第一,否則將無法能夠輸入任何記錄。 – HLGEM 2013-03-19 19:10:52

+0

@HLGEM:您可以在外鍵中插入帶'null'的記錄。但我同意,這通常指的是次優設計:) – Andomar 2013-03-19 19:13:09

+0

如果你的FK允許空值 – HLGEM 2013-03-19 19:20:09

相關問題