4

我有一个最初使用 SQLite 开发的小型数据库。当用户最初启动应用程序时,我的桌面应用程序会自动设置数据库表。

问题 几个表有 FOREIGN KEY 约束。假设我有表 A、表 B 和表 C。A 与 C 有 FOREIGN KEY 约束。但是当我进行初始表生成时,每次都会抛出 SQLExceptions 说如下内容:

约束“SQL130319142644383”无效:引用的表 PREDICTIONRUN 不存在。

(注意:由于其他外键问题,我不能简单地重新组织表。)

那么,如何创建具有 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 驱动程序)(这里没有问题,因为 SQLite 似乎没有强制执行创建约束)

开发 Java 7

4

1 回答 1

8

假设我有表 A、表 B 和表 C。A 与 C 有 FOREIGN KEY 约束。

简单的解决方案是在表 A 之前创建表 C。

在某些情况下您不能这样做:例如,两个表具有彼此的外键。这些情况是相当不寻常的。如果遇到一个,您可以创建没有外键的表。创建所有表后,您可以alter table将外键放入:

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