2016-10-20 3 views
0

3つ以下のコースにのみ登録されるように1つの本を制限したいと考えています。この制限をどうやって作りますか?1冊の本は最大3コースに制限されています。 Sql oracle

CREATE TABLE Course (
Book  varchar2(50) NOT NULL, 
Course  varchar2(50) 
CONSTRAINT chk_Course CHECK (Course IN ('database', 'programming', 'mathematics', 'statistic', 'chemistry', 'physics')), 
PRIMARY KEY(Book) 
); 

(私は経験の浅いとまだ学んだ注意してください) -

CREATE TABLE BOOK 
(
    ISBN  VARCHAR2(50), 
    TITEL  VARCHAR2(50), 
    PUBLISHER VARCHAR2(50), 
    YEAR   DATE CHECK (YEAR between TO_DATE('1900/01/01', 'yyyy/mm/dd') AND 
               TO_DATE('2017/01/01', 'yyyy/mm/dd')), 
    PRIMARY KEY(Isbn) 
) 
+0

ISBNのVarchar2(50)?それは寛大です! :) –

+0

ハ、私の心を完全にスリップ! – Peebl

答えて

0

まず、コースはそのテーブルの不適切な名前のように思えます。私はbook_assignmentsまたはbooks_coursesがより正確かもしれないと思う。

第2に、bookはコーステーブルの主キーであるため、1つのコースにのみ本を登録することができます。主キーを削除するか、(ブック、コース)に変更する必要があります。すべてのテーブルの列がプライマリキーにある場合は、デザインが正しいとは限りません。

この問題を解決する1つの方法は、挿入された現在のブックに関連付けられた行の数をクエリし、書籍がすでに3つのコースに登録されている場合は挿入/更新に失敗するトリガを作成することです。

私は別の方法を選択し、course1,course2,course3と呼ばれる3つの列を持つ書籍のテーブルを1つだけ使用します。いつか書籍を登録して20コースと言うことができれば、これは非常にスケーラブルな解決策ではありませんが、あなたの宿題には十分です。

+0

名前は大体ノルウェー語から翻訳されましたが、ええ、もちろん私の貧しい翻訳については同意します。だから私はこれを実装する最も簡単な方法は、2つ以上の列を追加することです?これは、タスクのERスキーマをレイアウトする方法でもあります。[Imgur link](http://imgur.com/a/foet3)FagFelt = Courses Bok = Book – Peebl

+0

割り当てにERが含まれている場合は、おそらくあなたは外国のキーを扱う方法を教えるためにそれを構築することを望みます –

+0

私は別の列をしませんが、本のコースの数に制限を強制することは非常に困難です。ブックテーブルのNUMBER_OF_COURSESを維持するトリガーは機能しますが、ブック行をロックして現在の割り当て数を確認し、インクリメント/デクリメントしてからコミットする必要があります。 –

関連する問題