2

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

此答案(默认为空字符串的列)和此答案(使用 DEFAULT 空字符串避免 NULL 列)表明可以使用 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 导致该列默认为两个单引号而不是空字符串。当列规则 NOT NULL 在没有 DEFAULT 规则的情况下单独使用时,看起来好像在插入新行时 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,
);

谢谢 :-)

4

1 回答 1

3

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

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

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

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

并使用 SELECT 检查结果:

SELECT * FROM clients

当您切换到 View->Results in Text 时会显示这一点

CLI_ID MRN   LASTNAME MIDNAME FIRSTNAME 
------ ----- -------- ------- --------- 
0      mrn00 Aname    (null)            
于 2013-04-02T06:10:42.673 回答