我正在调查更改某些单元测试(对于在DB2上运行的应用程序)使用Derby的可行性。找到this question后答案声称DB2和Derby非常兼容,似乎可以将DDL从DB2数据库中取出并在Derby数据库上运行它。但我似乎发现Derby不能与Derby DDL一起使用的情况。
所以我为DB2 9.1编写了DDL,如下所示:
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
);
在ij中运行此DDL不起作用,我收到此语法错误:
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 NONE
和DATA CAPTURE
以及CCSID EBCDIC
,我将不得不摆脱让Derby工作。但是对于这个代码库来说,对于所有空白的默认内容是一个大问题,如果有一个不同的内存数据库比Derby更好,我会接受建议。
答案 0 :(得分: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
);
答案 1 :(得分:1)
以上答案实际上并不是最佳答案。在 Apache Derby 中,为 NOT NULL 列设置默认值时不需要使用 WITH 指令。尽管支持 WITH,但它是不必要的。此示例说明了最佳语法。
CREATE TABLE FOO (
FOO_GUID integer not null generated by default as identity constraint FOO_PK primary key,
FOO_STATUS CHAR(1) NOT NULL DEFAULT 'I' ,
FOO_ACTIVE CHAR(1) DEFAULT 'Y' NOT NULL,
FOO_BAR CHAR(16)
);
INSERT INTO FOO(FOO_BAR) VALUES('BAR_FOO');
NOT NULL 可以出现在 DEFAULT 指令之前或之后,如上例所示。使用 START 和 No DATA 指令时需要 WITH 指令。