Правильный способ указать пустую строку по умолчанию для столбца в HSQLDB?

Возможность и способ указания столбца таблицы с пустой строкой по умолчанию зависят от реализации СУБД.

Этот ответ (по умолчанию столбец с пустой строкой) и этот (Избегайте столбцов NULL с использованием пустой строки DEFAULT) указывает, что пустая строка по умолчанию может быть задано правилом столбца CREATE TABLE, которое использует пустой литерал в одинарных кавычках с ограничением DEFAULT.

Вот отрывок из DDL, который я использовал в HSQLDB 2.2.9. Я выполняю SQL для базы данных с помощью SQuirreL 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,
);

фамилия не может быть NULL

midName не имеет правил для столбцов

firstName не имеет значения NULL, и делается попытка сделать его по умолчанию пустой строкой, указав литерал пустой строки, как это было предложено в предыдущих ответах.

Когда я использую SQuirreL, чтобы сделать эту таблицу редактируемой, а затем вставляю строку в таблицу, в столбцах появляются следующие значения:

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

Кажется, что семантика DEFAULT '' NOT NULL в HSQLDB приводит к тому, что столбец по умолчанию использует две одинарные кавычки, а не пустую строку. Когда правило столбца NOT NULL используется отдельно без правила DEFAULT, SQuirreL сообщает о пустой строке при вставке новой строки.

Может ли кто-нибудь подтвердить, что правильный способ иметь столбец VARCHAR в HSQLDB по умолчанию для ненулевой, пустой строки нулевой длины - использовать эту семантику:

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,
);

Спасибо :-)


person scottb    schedule 02.04.2013    source источник
comment
Тогда это похоже на беличьего жука. Может быть, Squirrel пытается быть умнее и извлекает выражение по умолчанию и отправляет его в базу данных для столбцов, которые вы не редактируете. Это отлично работает для меня с моим клиентом SQL. Вы видите, какой оператор Squirrel отправляет в базу данных? Если вы не отредактируете его, оператор не должен включать столбец firstName (или его значение должно быть отправлено с использованием ключевого слова DEFAULT)   -  person a_horse_with_no_name    schedule 02.04.2013


Ответы (1)


Правильный способ - это ваш оригинальный CREATE TABLE. Если столбец не имеет предложения DEFAULT, но имеет ограничение NOT NULL, то он не имеет значения по умолчанию, и вы должны включить значение для столбца при вставке в таблицу.

Возможно, клиент SQuirreL использует собственное соглашение для отображения или вставки столбца firstName.

Вы можете вставить неполную строку с оператором SQL, используя HSQLDB DatabaseManager:

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)            
person fredt    schedule 02.04.2013