【问题标题】:One book being limited to max 3 courses | Sql oracle一本书仅限于最多 3 门课程 | Sql 预言机
【发布时间】:2017-03-02 03:26:05
【问题描述】:

我想将一本书限制为只能注册 3 门或更少的课程。我将如何创建此限制? (注意我没有经验,还在学习)

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)
)

【问题讨论】:

  • Varchar2(50) 用于 ISBN?真是大方! :)
  • 哈,我完全忘记了!

标签: sql oracle oracle-sqldeveloper restriction


【解决方案1】:

首先,对于该表来说,Course 似乎是一个不恰当的名称。我认为book_assignmentsbooks_courses 可以更准确。

其次,在您当前的结构中,一本书只能注册一门课程,因为book 是 Course 表中的主键,该表中每本书只允许一行。您将需要删除主键或将其更改为 (Book,Course)。请记住,如果所有表的列都在主键中,则设计可能不正确。

解决此问题的一种方法是创建一个触发器,该触发器查询与当前插入的书籍相关联的行数,如果该书籍已注册到 3 门课程,则插入/更新失败。

我会选择一种不同的方法,只使用一个表格来存放书籍,其中包含 3 个名为 course1,course2,course3 的列。如果有一天一本书可以注册为 20 门课程,这不是一个非常可扩展的解决方案,但对于您的家庭作业来说已经足够了。

【讨论】:

  • 这些名字大致是从挪威语翻译过来的,但是我当然同意我的糟糕翻译。所以我实现这一点的最简单方法是再添加 2 个列?这也是任务Imgur link FagFelt = Courses Bok = Book 任务的 ER Schema 的布局方式
  • 如果作业包含您最好坚持使用的 ER,他们可能希望您以这种方式构建它来教您如何使用外键
  • 我不会做单独的栏目,但是很难强制限制一本书的课程数量。在 book 表上维护 NUMBER_OF_COURSES 的触发器可以工作,但为了安全起见,它需要锁定 book 行,然后检查当前分配的数量,增加/减少它们,然后提交。
  • 那我该如何创建这个触发器呢?
  • 这是一个完全不同的问题,可能是你作业的一部分。阅读有关 Oracle 触发器及其工作方式的信息,您可能会弄明白。
猜你喜欢
  • 1970-01-01
  • 2014-06-14
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2015-05-16
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多