Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Нужно исправить ключи в скрипте MySQL WorkBench

Дмитрий Александров Знаток (495), на голосовании 3 года назад
Добрый день! Пишу БД в WorkBench. Типа база какой-то библиотеки. Отправил преподу. Он сказал, что есть косяк по ключам. А именно вот, что было предложено.

"В таблице, которая отвечает за записи о выдаче, связи с книгой и читателем у вас получились необязательные, то есть можно в эту таблицу добавить запись о выдаче, не указывая ни книги, ни читателя. На мой взгляд это странно. Поэтому я предлагаю в этой таблице сделать первичным ключом не id, а совокупность первичных ключей из таблиц книга и читатель (создав при этом внешние ключи из таблицы для выдачи к таблицам книга и читатель), тогда заполнение этих полей станет обязательным."

Вот сам код:
-- Издательство
CREATE TABLE PublishingHouse(
ID INT PRIMARY KEY,
PublishingHouseName VARCHAR(50), --Название издетельства
City VARCHAR(30), --Город, где находится издательство
Country VARCHAR(30) -- Страна, где находится издательство
);

-- Авторы книг
CREATE TABLE Authors(
ID INT PRIMARY KEY,
AuthorFirstName VARCHAR(30), --Имя автора книги
AuthorLastName VARCHAR(30), --Фамилия автора книги
);

-- Жанры книг
CREATE TABLE Genres(
ID INT PRIMARY KEY,
GenreName VARCHAR(50) -- Название жанра
);

-- Языки
CREATE TABLE Languages(
ID INT PRIMARY KEY,
LanguageName VARCHAR(50) -- Название языка
);

-- Книги
CREATE TABLE Books(
ID INT PRIMARY KEY,
AuthorID INT NOT NULL, --FK к таблице Авторов
GenreID INT NOT NULL, --FK к таблице Жанров
BookName VARCHAR(50), --Название книги
LanguageID INT NOT NULL, --FK к таблице Языков
PublishingHouseID INT NOT NULL, --FK к таблице Издательств
PublishYear DATE, --Дата публикции книги
FOREIGN KEY (AuthorID) REFERENCES Authors(ID),
FOREIGN KEY (GenreID) REFERENCES Genres(ID),
FOREIGN KEY (LanguageID) REFERENCES Languages(ID)
FOREIGN KEY (PublishingHouseID) REFERENCES PublishingHouse(ID)
);

-- Читатели
CREATE TABLE Readers(
ID INT PRIMARY KEY,
ReaderPassID INT NOT NULL UNIQUE, --Номер пасспорта читателя
ReaderFirstName VARCHAR(30), --Имя читателя
ReaderLastName VARCHAR(30), --Фамилия читателя
);

-- Выдачача книг
CREATE TABLE Issuing(
ID INT PRIMARY KEY,
ReaderID INT NOT NULL, --FK к таблице читателей
BookID INT NOT NULL, --FK к таблице Книг
IssuingDate DATETIME, --Дата/Время выдачи
IssuingDateEnd DATETIME, --Дата/Время сдачи
STATUS VARCHAR(15) CONSTRAINT (STATUS) CHECK (STATUS IN ('Сдал', 'Не сдал', 'Просрочил')), --Состояние (Сдал/Просрочка)
FOREIGN KEY (ReaderID) REFERENCES Readers(ID),
FOREIGN KEY (BookID) REFERENCES Books(ID)
);

Помогите пожалуйста исправить. Я уже над этим скриптом третий день сижу и чет не соображу что сделать нужно. Мозги уже кипят. Заранее благодарю за помощь!
Голосование за лучший ответ
Александр Искусственный Интеллект (289408) 4 года назад
Пишу БД в WorkBench....ого! это что-то особенное что требует особого отношения?

читать в строну "Composite Key"... а не простые примеры заучивать

в строке
ID INT PRIMARY KEY,
убрать
PRIMARY KEY
и где-нить внизу, там где у вас всякие FOREIGN KEY расписаны, добавить строчку
PRIMARY KEY (ReaderID, BookID)
ну, не забыть запятые поставить где надо -- это уж ваша забота...

если я тут сильно ошибся -- умные люди поправят...
АлександрИскусственный Интеллект (289408) 4 года назад
вот уже пишут злобные письма...
типа убрать строку
ID INT PRIMARY KEY
добавить строку
CONSTRAINT ID PRIMARY KEY (ReaderID, BookID)
Похожие вопросы