如何修复:使用derby / EmbeddedDriver的ON DELETE CASCADE ON UPDATE CASCADE问题

3
以下是我的样例代码的一部分:
public static void main(String[] args) throws Exception {
    // TODO code application logic here
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
    Connection c = DriverManager
            .getConnection("jdbc:derby:DatabaseTrial;create=true");

    System.out.println("connection ok");

    String schema = "CREATE SCHEMA ABC";
    String subj = "CREATE TABLE ABC.SUBJ (SUBJ_NO INT NOT NULL, DESCRIPTIVE_TITLE VARCHAR(80) NOT NULL, TEACHER VARCHAR(80), PRIMARY KEY (SUBJ_NO))";
    String table = "CREATE TABLE ABC.REQ (REQ_NO INT NOT NULL, " + 
    "STATUS CHAR(8) DEFAULT NULL, SUBJ_NO INT NOT NULL, PRIMARY KEY (REQ_NO), FOREIGN KEY (SUBJ_NO) REFERENCES ABC.SUBJ(SUBJ_NO) ON DELETE CASCADE ON UPDATE CASCADE)";
    String insert = "INSERT INTO ABC.REQ VALUES (1, DEFAULT, 1)";
    String insert2 = "INSERT INTO ABC.SUBJ VALUES (1, 'Programming Application Lab', 'Mr. CBO Montes')";    

    Statement s = c.createStatement();

    s.executeUpdate(schema);
    s.executeUpdate(subj);
    s.executeUpdate(table);
    s.executeUpdate(insert2);
    s.executeUpdate(insert);

    ResultSet rs = s.executeQuery("SELECT * FROM ABC.MINE NATURAL JOIN ABC.SUBJ");
    while (rs.next()) {
        System.out.println(rs.getInt(1) + " " + rs.getString("STATUS") + " " + rs.getString("Subj_no") + " " + rs.getString("DESCRIPTIVE_TITLE") + " " + rs.getString("TEACHER"));
    }

    c.close();
}

我总是收到以下错误消息:

在 "main" 线程中的异常 java.sql.SQLSyntaxErrorException: 语法错误: 在第1行,第196列遇到"CASCADE"。 at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.executeLargeUpdate(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown Source) at TrialDBEmbedded.main(TrialDBEmbedded.java:26) 由于以下原因造成:ERROR 42X01: 在第1行,第196列遇到语法错误:"CASCADE"。 at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.impl.sql.compile.ParserImpl.parseStatementOrSearchCondition(Unknown Source) at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source) at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source) ... 4 more

1个回答

1

看起来 Derby 并不支持 ON UPDATE CASCADE。九年前有一个功能请求被提出,但显然从未被实现。使用 Derby 10.8,我刚刚确认 ON UPDATE RESTRICT 可用,但 ON UPDATE CASCADE 会抛出您遇到的异常。( ON DELETE CASCADE 也可以使用。)


这是Derby缺少的一个非常基本的东西...现在已经是2017年了,版本号为10.13,我仍然无法使用ON UPDATE CASCADE。(这太让人沮丧了) - kiwicomb123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接