#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. Эти выражения очень специфичны и гарантированно возвращают один и тот же результат независимо от того, когда вы проверяете ограничение. Это исключает пользовательские функции и многие встроенные.
Вы можете добавить ТРИГГЕР с желаемой проверкой. ТРИГГЕР выполняется во время вставки или ОБНОВЛЕНИЯ, поэтому он не гарантирует действительность в будущем.