2013-04-02 18 views
1

可以使用默认空字符串指定表列的能力和方式看起来与RDBMS实现相关。在HSQLDB中为列指定默认空字符串的正确方法?

此答案(default a column with empty string)和这一个(Avoid NULL columns using DEFAULT Empty String)表明可以使用带有DEFAULT约束的空单引号字面值的CREATE TABLE列规则设置默认空字符串。

这是我在HSQLDB 2.2.9中使用的DDL摘录。我执行SQL对数据库鼠笼3.4.0:

CREATE CACHED TABLE Clients ( 
    cli_id  INTEGER  GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    mRN   VARCHAR(24) NOT NULL UNIQUE, 
    lastName  VARCHAR(48) NOT NULL, 
    midName  VARCHAR(24), 
    firstName VARCHAR(24) DEFAULT '' NOT NULL, 
); 

lastName的可能不是NULL

midName没有列规则

的firstName不能为空,并试图把它通过指定前面的答案建议的空字符串文字来默认为空字符串。

当我使用松鼠使这个表格编辑,然后插入一行到表中,下面的值出现在列:

lastName: (empty) 
midName:  <null> 
firstName: '' 

看来,语义DEFAULT“”在HSQLDB事业NOT NULL该列默认为两个单引号而不是空字符串。当没有DEFAULT规则的情况下单独使用列规则NOT NULL时,看起来好像插入新行时由SQuirreL报告了一个空字符串。

有人可以证实,为了在HSQLDB默认为一个非空的,空的,零长度字符串VARCHAR列的正确方法是使用这些语义:

CREATE CACHED TABLE Clients ( 
    cli_id  INTEGER  GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    mRN   VARCHAR(24) NOT NULL UNIQUE, 
    lastName  VARCHAR(48) NOT NULL, 
    midName  VARCHAR(24) NOT NULL, 
    firstName VARCHAR(24) NOT NULL, 
); 

感谢:-)

+1

那好像是一只松鼠虫。也许Squirrel试图变得聪明,并检索默认表达式并将其发送到数据库以查找您不需要编辑的列。这对我的SQL客户端来说工作正常。你能看到Squirrel发送到数据库的声明吗?如果你不编辑它,那么声明不应该包含'firstName'列(或者它的值应该使用'DEFAULT'关键字来发送) –

回答

3

正确的方法实际上是您的原始CREATE TABLE。如果列没有DEFAULT子句但具有NOT NULL约束,那么它没有默认值,并且您在插入表时必须包含该列的值。

它可能是SQuirreL客户端使用它自己的约定来显示或插入firstName列。

您可以插入一个不完整的一行一条SQL语句,使用HSQLDB的DatabaseManager:

INSERT INTO clients(mrn, lastname) VALUES 'mrn00', 'Aname' 

并配有SELECT查询结果:

SELECT * FROM clients 

这都说明这个当您切换到查看 - >文字结果

CLI_ID MRN LASTNAME MIDNAME FIRSTNAME 
------ ----- -------- ------- --------- 
0  mrn00 Aname (null)    
相关问题