在HSQLDB中为列指定默认空字符串的正确方法?

时间:2013-04-02 01:21:45

标签: sql constraints hsqldb ddl

使用默认空字符串指定表列的能力和方式似乎取决于RDBMS实现。

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

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

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不可为空,并且通过指定前面答案所建议的空字符串文字,尝试将其默认为空字符串。

当我使用SQuirreL使该表可编辑然后在表中插入一行时,列中会显示以下值:

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

似乎HSQLDB中的语义DEFAULT''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 个答案:

答案 0 :(得分:3)

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

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

您可以使用HSQLDB DatabaseManager插入带有SQL语句的不完整行:

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

用SELECT:

检查结果
SELECT * FROM clients

当您切换到View-&gt; Text in Text

时,会显示此信息
CLI_ID MRN   LASTNAME MIDNAME FIRSTNAME 
------ ----- -------- ------- --------- 
0      mrn00 Aname    (null)