#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 и о том, как они работают, вы, вероятно, поймете это.