2017-06-16 59 views
0

Oracle SQL首次使用Oracle DB創建有一些限制的表

我開始有一個非常基本的Person表: ["ID", "Age", "Workclass", "fnlwgt", "Education", "Education-Num", "Martial Status", "Occupation", "Relationship", "Race", "Sex", "Capital Gain", "Capital Loss", "Hours per week", "Country", "Target"]

而且一個Relationship表:["PersonID", "RelativeID", "Relation"]

  • 一個人的workclass只能在給定值之一: 私人,自我實現而非其他價值
  • 人的年齡必須大於他的孩子。
  • 父母必須至少12歲
  • 的人是不能賺的比他的妻子更

我首先想到的是要檢查這些東西在我的客戶端的代碼級,但我想有更好的用純sql實現這一點的方法。

我想創建這些約束的表,但我真的一無所知的Oracle SQL

+0

「一個男人賺不了他的妻子」。我們在哪個世紀? –

+0

@戈登讓我覺得這是一個家庭作業或什麼.. :)即奇怪的標準,以生成一個特定的邏輯情況下「實踐」:) – Ditto

+0

通過表約束,你不能達到你想要的。要麼執行過程來執行這些驗證,要麼使用觸發器。 –

回答

0

,以滿足您的標準。我想嘗試以下操作:

  • 的的workclass人只能在給定值中的一個:私人自EMP-不-INC和其他一些價值觀

設置另一個表,命名爲「 workclass_type」 數據如下:

ID WorkClass_Name 1私人 2自EMP 3 .... ,你需要的任何其他值。

將Person表上的「workclass」列更改爲「workclass_ID」 ,並在該表中指向該列的FK,指向workclass_type中的ID col。

這被稱爲參照約束(或外鍵 - 同一件事)。它告訴Oracle將選擇限制在其他表中的內容。 這對節省空間非常有用(除其他外),因爲您不會在每一行上存儲完整的字符串名稱,只是一個小的數字ID。

可以/應該通過填充序列中的ID列...但我會讓你發現;)

  • 一個人的年齡必須比他的孩子大。

不容易通過限制做...你可以通過觸發做到這一點,但是,我不會建議它..觸發 有自己的一套的問題,往往會導致更大的問題。 我推薦一個存儲過程(如Renato在評論中所建議的那樣)。

創建一個INS程序..並強制每個人通過該程序進來。 換句話說,不要將表暴露給INS/UPD ...,而是暴露過程。

(當我說過程,我指的是包內的程序.. ..更容易再次..我讓你發現 既然已經術語):)

  • 父母必須至少12歲
再次

,你上面的程序的一部分。

  • 一個人不能賺取更多的比他的妻子

再次,你上面的程序的一部分。

+0

謝謝!這對我來說足夠了 –