Одна книга ограничена максимум 3 курсами | Sql oracle

#sql #oracle #oracle-sqldeveloper #restriction

#sql #Oracle #oracle-sqldeveloper #ограничение

Вопрос:

Я хочу ограничить регистрацию одной книги только 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)
)
  

Комментарии:

1. Varchar2 (50) для ISBN? Это щедро! 🙂

2. Хах, совершенно вылетело из головы!

Ответ №1:

Во-первых, курс кажется неподходящим названием для этой таблицы. Я думаю, что book_assignments или books_courses может быть более точным.

Во-вторых, в вашей текущей структуре — книга может быть зарегистрирована только для одного курса, поскольку book является первичным ключом в таблице курсов, что позволяет использовать только одну строку для каждой книги в этой таблице. Вам нужно будет удалить первичный ключ или изменить его на (Книга, курс). Имейте в виду, что если все столбцы таблиц находятся в первичном ключе, дизайн, вероятно, неправильный.

Одним из способов решения этой проблемы является создание триггера, который запрашивает количество строк, связанных с текущей вставленной книгой, и сбой вставки / обновления, если книга уже зарегистрирована на 3 курса.

Я бы выбрал другой подход и использовал только одну таблицу для книг с 3 названными столбцами course1,course2,course3 . Это не очень масштабируемое решение, если когда-нибудь книга может быть зарегистрирована, скажем, на 20 курсов, но этого достаточно для вашей домашней работы.

Комментарии:

1. Названия были примерно переведены с норвежского, но да, я согласен с моим плохим переводом, конечно. Итак, мой самый простой способ реализовать это — просто добавить еще 2 столбца? Это также то, как была выложена ER-схема задачи по ссылке Imgur FagFelt = Courses Bok = Book

2. ЕСЛИ задание содержало ER, вам лучше придерживаться его, они, вероятно, хотят, чтобы вы создали его таким образом, чтобы научить вас работать с внешними ключами

3. Я бы не стал делать отдельные столбцы, но очень сложно ввести ограничение на количество курсов для книги. Триггер, который поддерживает NUMBER_OF_COURSES в таблице book, будет работать, но для обеспечения безопасности ему потребуется заблокировать строку book, а затем проверить текущее количество назначений, увеличить / уменьшить их, а затем зафиксировать.

4. Как бы я тогда создал этот триггер?

5. Это совершенно другой вопрос и, вероятно, часть вашего домашнего задания. Прочитайте о триггерах Oracle и о том, как они работают, вы, вероятно, поймете это.