2016-01-08 60 views
1

我有3個表格,「課程」(id,start_date),「訂閱」(id,assistant_id,course_id,date)和「助理」(id,registration_date)。根據LibreOffice基礎中的另一個表字段創建字段約束

訂閱參考課程和助理與你看到的外鍵。

如果引用的Courses.start_date比引用的Assistants.registration_date舊,我需要添加CHECK約束,以防止創建訂閱記錄。在自由基地有沒有辦法做到這一點?

表格組織無法更改。

回答

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引擎壓縮在Base中,而舊版本1.8也是一個非常可靠的(免費)引擎。由於Base分析器已針對HSQLDB進行了優化,除非用戶事先熟悉MySQL,否則最好升級到當前的HSQLDB版本(2.x),而不是完全切換數據庫。 – Lyrl

+0

謝謝。在我的情況下,查詢絕對是答案,事實證明我的任務描述得很差,我不必過濾日期範圍內的輸入,而是輸出。 –

相關問題