使用默认空字符串指定表列的能力和方式似乎取决于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,
);
谢谢: - )
答案 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)