为 HSQLDB 中的列指定默认空字符串的正确方法?
Posted
技术标签:
【中文标题】为 HSQLDB 中的列指定默认空字符串的正确方法?【英文标题】:Correct way to specify a default empty string for a column in HSQLDB? 【发布时间】:2013-04-02 01:21:45 【问题描述】:使用默认空字符串指定表列的能力和方式似乎取决于 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,
);
谢谢:-)
【问题讨论】:
那似乎是一只松鼠虫。也许 Squirrel 试图变得聪明并检索默认表达式并将其发送到数据库以获取您未编辑的列。这适用于我的 SQL 客户端。你能看到 Squirrel 向数据库发送的语句吗?如果您不对其进行编辑,则该语句不应包含firstName
列(或其值应使用 DEFAULT
关键字发送)
【参考方案1】:
正确的方法其实是你原来的 CREATE TABLE。如果列没有 DEFAULT 子句但有 NOT NULL 约束,则它没有默认值,并且在插入表时必须包含该列的值。
可能是 SQuirreL 客户端使用它自己的约定来显示或插入 firstName 列。
您可以使用 SQL 语句插入不完整的行,使用 HSQLDB 数据库管理器:
INSERT INTO clients(mrn, lastname) VALUES 'mrn00', 'Aname'
然后使用 SELECT 检查结果:
SELECT * FROM clients
当您切换到“查看”->“文本中的结果”时会显示此内容
CLI_ID MRN LASTNAME MIDNAME FIRSTNAME
------ ----- -------- ------- ---------
0 mrn00 Aname (null)
【讨论】:
以上是关于为 HSQLDB 中的列指定默认空字符串的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章