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
當然,如果你有一個有外鍵對方比你有一個需要設計問題表要解決的第一,否則將無法能夠輸入任何記錄。 – HLGEM 2013-03-19 19:10:52
@HLGEM:您可以在外鍵中插入帶'null'的記錄。但我同意,這通常指的是次優設計:) – Andomar 2013-03-19 19:13:09
如果你的FK允許空值 – HLGEM 2013-03-19 19:20:09