2016-01-08 3 views
1

У меня есть 3 таблицы, «Курсы» (id, start_date), «Подписки» (id, assistant_id, course_id, date) и «Помощники» (id, registration_date).Создать ограничение поля на основе другого поля таблицы в базе LibreOffice

Подписки справочные курсы и помощники с иностранными ключами, как вы видите.

Мне нужно добавить ограничение CHECK, которое предотвратит создание записи подписки, если ссылка Courses.start_date старше, чем указано Assistants.registration_date. Есть ли способ сделать это в Libre Base?

Невозможно изменить организацию таблицы.

ответ

2

Такое ограничение CHECK не может быть создано с помощью двигателя по умолчанию. Из HSQLDB 1.8 documentation:

ALTER TABLE <tablename> ADD [CONSTRAINT <constraintname>] CHECK (<search condition>);

Adds a check constraint to the table. In the current version, a check constraint can reference only the row being inserted or updated.

Это означает, что команды, такие как следующие из TestSelfCheckConstraints.txt выдают ошибку:

/*e*/CREATE TABLE TC6(A CHAR, B CHAR, C CHAR, D INT, CHECK(A IN (SELECT A FROM TC5)));

Таким образом, чтобы выполнить такую ​​проверку, вы должны проверить это заранее (или затем) с использованием запроса. Это можно сделать для формы, добавив макрос на вкладку «События». См. Этот пост для идей: https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=21414.

Двигатель по умолчанию довольно старый, поэтому для таких сложных требований может быть лучше настроить LibreOffice Base для использования другого механизма базы данных. Например, используя MySQL, можно настроить триггер хранимой процедуры для такого рода проверки. См. CHECK constraint in MySQL is not working.

+1

Двигатель HSQLDB по умолчанию, который поставляется с базой, в то время как старый - версия 1.8 - также очень надежный (и свободный) движок. Поскольку базовый парсер оптимизирован для HSQLDB, если у пользователя нет предварительного знакомства с MySQL, лучше всего перейти на текущую версию HSQLDB (2.x), вместо того чтобы полностью переключать базы данных. – Lyrl

+0

Спасибо. В моем случае запрос был определенно ответом, оказалось, что моя задача была плохо описана, и мне не пришлось фильтровать входные данные по диапазону дат, но вывод. –