4

もともと 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

4

1 に答える 1

8

テーブル A、テーブル B、およびテーブル C があるとします。A には、C との FOREIGN KEY 制約があります。

簡単な解決策は、テーブル A の前にテーブル C を作成することです。

できない状況もあります。たとえば、相互に外部キーを持つ 2 つのテーブルなどです。こうした状況はかなり珍しいものです。発生した場合は、外部キーなしでテーブルを作成できます。すべてのテーブルを作成したら、次alter tableの外部キーを使用できます。

alter table YourTable add constraint FK_YourTable_Column1
    foreign key references OtherTable(Column1)
于 2013-03-19T18:49:45.300 に答える