Связать последовательность с идентификатором в hsqldb - PullRequest
9 голосов
/ 02 июня 2010

В PostgreSql можно определить последовательность и использовать ее в качестве первичного ключа таблицы. В HsqlDB все еще можно выполнить создание столбца идентификатора с автоинкрементом, который не связан ни с какой определенной пользователем последовательностью. Можно ли использовать определенную пользователем последовательность в качестве генератора столбца идентификатора с автоинкрементом в HsqlDB?

Пример sql в PostgreSql:

CREATE SEQUENCE seq_company_id START WITH 1;

CREATE TABLE company (
  id bigint PRIMARY KEY DEFAULT nextval('seq_company_id'),
  name varchar(128) NOT NULL CHECK (name <> '')
);

Что такое эквивалент в HsqlDB?

Спасибо.

1 Ответ

15 голосов
/ 11 июня 2010

В версии 2.0 для этого нет прямой функции. Вы можете определить триггер BEFORE INSERT для таблицы, чтобы сделать это:

CREATE TABLE company ( id bigint PRIMARY KEY, name varchar(128) NOT NULL CHECK (name <> '') );

CREATE TRIGGER trigg BEFORE INSERT
ON company REFERENCING NEW ROW AS newrow 
FOR EACH ROW
SET newrow.id = NEXT VALUE FOR seq_company_id;

и вставьте без использования vlue для id

ВСТАВИТЬ В ЗНАЧЕНИЯ компании null, 'test'

Обновление для HSQLDB 2.1 и более поздних версий: Добавлена ​​функция для поддержки этого.

CREATE SEQUENCE SEQU
CREATE TABLE company ( id bigint GENERATED BY DEFAULT AS SEQUENCE SEQU PRIMARY KEY, name varchar(128) NOT NULL CHECK (name <> '') );

См. Руководство в CREATE TABLE http://hsqldb.org/doc/2.0/guide/databaseobjects-chapt.html#dbc_table_creation

Кроме того, 2.1 и более поздние версии имеют режим совместимости с PostgreSQL, в котором он принимает оператор PostgreSQL CREATE TABLE, который ссылается на последовательность в предложении DEFAULT и переводит ее в синтаксис HSQLDB.

...