HSQLDB — Как использовать пользовательскую функцию в ограничении проверки

#java #sql #hsqldb

#java #sql #hsqldb

Вопрос:

Сначала я создаю простую функцию:

 CREATE FUNCTION MY_FUNCTION(IN MY_ID BIGINT) RETURNS BOOLEAN
    SPECIFIC MY_FUNCTION_WITH_BIGINT LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA RETURNS NULL ON NULL INPUT
RETURN MY_ID IN (SELECT ID
              FROM TABLE1
              WHERE NAME IN ('name1', 'name2'));
 

Затем я пытаюсь использовать ее в CHECK ограничении:

 ALTER TABLE TABLE2 ADD CONSTRAINT CONSTRAINT1 CHECK (MY_FUNCTION(C1) = TRUE)
 

Я понимаю это:

 java.lang.RuntimeException: org.hsqldb.HsqlException: invalid expression in CHECK or GENERATED clause
 

Я не понимаю, почему, есть ли способ добиться желаемого эффекта?

Комментарии:

1. Почему вы не используете внешний ключ?

2. @a_horse_with_no_name я делаю, но я хотел бы иметь возможность разрешать только определенные значения. Я не могу создавать дополнительные таблицы для решения этой проблемы только с помощью внешнего ключа.

3. Насколько я знаю, HSQLDB не поддерживает пользовательские функции для ограничений проверки.

Ответ №1:

По умолчанию HSQLDB допускает только те типы выражений, которые разрешены стандартом SQL. Эти выражения очень специфичны и гарантированно возвращают один и тот же результат независимо от того, когда вы проверяете ограничение. Это исключает пользовательские функции и многие встроенные.

Вы можете добавить ТРИГГЕР с желаемой проверкой. ТРИГГЕР выполняется во время вставки или ОБНОВЛЕНИЯ, поэтому он не гарантирует действительность в будущем.