2013-04-02 43 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)    
相關問題