もともと SQLite を使用して開発された小さなデータベースがあります。私のデスクトップ アプリケーションは、ユーザーが最初にアプリケーションを起動したときにデータベース テーブルを自動的にセットアップします。
問題 いくつかのテーブルに FOREIGN KEY 制約があります。テーブル A、テーブル B、およびテーブル C があるとします。A には C の FOREIGN KEY 制約があります。
制約 'SQL130319142644383' は無効です: 参照されるテーブル PREDICTIONRUN が存在しません。
(注: 他の FOREIGN KEY の問題があるため、単純にテーブルを再編成することはできません。)
では、FOREIGN 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/Derby SQLite (Xerial Driver 経由) (SQLite は作成時に制約を課していないように見えるため、ここでは問題ありません)
開発 Java 7