1

我正在研究将一些单元测试(对于在 DB2 上运行的应用程序)更改为使用 Derby 的可行性。发现这个问题的答案声称 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.

产生与 DB2 DDL 相同的默认值的 Derby 的 DDL 是什么?我知道我可能需要更改 DDL,它充满了奇怪的东西,比如和AUDIT NONE我将不得不摆脱 Derby 的工作。但是对于这个代码库来说,将所有内容默认为全空白是一件大事,如果有一个不同的内存数据库在这方面会比 Derby 做得更好,我愿意接受建议。DATA CAPTURECCSID EBCDIC

4

2 回答 2

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
);
于 2010-10-01T15:08:14.400 回答
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 指令。

于 2021-03-26T17:13:03.537 回答