2010-10-01 107 views
1

我正在研究如何更改某些单元测试(对于在DB2上运行的应用程序)来使用Derby。在发现this question的答案声称DB2和Derby非常兼容时,似乎可以将DDL从DB2数据库中取出并在Derby数据库上运行它。但我似乎发现了Derby不能与德比DDL一起使用的情况。Derby相当于DB2的“NOT NULL WITH DEFAULT”

所以我DDL为DB2 9.1,看起来像这样写的:

CREATE TABLE FOO (
    FOO_ID CHAR(17) NOT NULL, 
    FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT , 
    FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT , 
    FOO_DT DATE NOT NULL WITH DEFAULT 
); 

运行这个DDL在IJ不工作,我得到这个语法错误:

ij> run 'c:/derby/db-derby-10.6.1.0-bin/foo.sql'; 
ij> CREATE TABLE FOO (
      FOO_ID CHAR(17) NOT NULL, 
      FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT , 
      FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT , 
      FOO_DT DATE NOT NULL WITH DEFAULT 
    ); 
ERROR 42X01: Syntax error: Encountered "," at line 3, column 62. 
Issue the 'help' command for general information on IJ command syntax. 
Any unrecognized commands are treated as potential SQL commands and executed dir 
ectly. 
Consult your DBMS server reference documentation for details of the SQL syntax s 
upported by your server. 

什么Derby的DDL将导致与DB2 DDL相同的默认值? 我得知我可能需要更改DDL,它充满了奇怪的东西,如AUDIT NONEDATA CAPTURECCSID EBCDIC,我将不得不摆脱Derby的工作。但是,如果有一个不同的内存数据库比Derby做得更好,我愿意接受这些建议,但是对全部空白默认的东西对于这个代码库是一件大事。

回答

3

我其实并没有在德比尝试过。但我的猜测是,它会工作,如果你明确说明什么是默认值,如下所示:

CREATE TABLE FOO (
    FOO_ID CHAR(17) NOT NULL, 
    FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT ' ' , 
    FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT ' ', 
    FOO_DT DATE NOT NULL WITH DEFAULT CURRENT DATE 
); 
+0

是的我相信这是正确的语法。以下是默认表达式的Derby文档链接:http://db.apache.org/derby/docs/dev/ref/rrefsqlj30540.html#rrefsqlj30540 – 2010-10-01 22:42:07