我想为我拥有的示例项目建立一个数据库。我选择了驾驶学校,并使用包括教师,学生,汽车,授课时间和预订的表格。该代码可以在代码部分中看到。前四个表,即老师,学生,汽车和课时都是预订中的外键。
我的问题是我需要这些外键的证书组合才能使用一次。让我澄清一下: -老师不能两次教同一个课 -学生不能两次开车上课 -在同一课时不能两次使用汽车 -但是,只要您有学生,老师和汽车在这段时间内还没有被预订,time_教训中的时间就可以多次使用。
我该如何设置?
请参阅下面的代码以查看到目前为止我做了什么...
DROP DATABASE IF EXISTS c4trafik;
CREATE DATABASE c4trafik;
USE c4trafik;
CREATE TABLE teachers(
id INT PRIMARY KEY AUTO_INCREMENT,
t_fname VARCHAR(20) NOT NULL,
t_lname VARCHAR(20) NOT NULL,
auth_lvl INT DEFAULT 3
);
CREATE TABLE pupils(
id INT PRIMARY KEY AUTO_INCREMENT,
p_fname VARCHAR(20) NOT NULL,
p_lname VARCHAR(20) NOT NULL,
persnr CHAR(10) NOT NULL,
email VARCHAR(50) DEFAULT NULL,
telnr VARCHAR(10) DEFAULT NULL,
to_pay INT DEFAULT 0,
has_pay INT DEFAULT 0
);
CREATE TABLE cars(
id INT PRIMARY KEY AUTO_INCREMENT,
regnr VARCHAR(6) NOT NULL,
auto_gear BOOLEAN DEFAULT false
);
CREATE TABLE time_lessons(
id INT PRIMARY KEY AUTO_INCREMENT,
t_start TIMESTAMP NOT NULL,
t_end TIMESTAMP NOT NULL,
les_type VARCHAR(20) DEFAULT 'Driving Lesson'
);
CREATE TABLE bookings(
teachers_id INTEGER NOT NULL,
pupils_id INTEGER NOT NULL,
cars_id INTEGER NOT NULL,
time_lessons_id INTEGER NOT NULL,
FOREIGN KEY(teachers_id) REFERENCES teachers(id),
FOREIGN KEY(pupils_id) REFERENCES pupils(id) ON DELETE CASCADE,
FOREIGN KEY(cars_id) REFERENCES cars(id),
FOREIGN KEY(time_lessons_id) REFERENCES time_lessons(id) ON DELETE CASCADE,
PRIMARY KEY(teachers_id, pupils_id, cars_id, time_lessons_id)
);
INSERT INTO teachers (t_fname, t_lname, auth_lvl) VALUES
('Ali', 'Alisson', 1),
('Adam', 'Adamsson', 2),
('Noah', 'Noahsson', 3);
INSERT INTO pupils(p_fname, p_lname, persnr, email, telnr, to_pay, has_pay) VALUES
('Jakob', 'Jaboksson', '8702111254', 'pupil1@gmail.com','0704585962', 2800, 2800),
('Hassan','Hassansson', '9504234858' ,NULL,'0704125463',5000,1000),
('Mona','Monasson', '9410118547',NULL, NULL, 10200, NULL);
INSERT INTO cars (regnr, auto_gear) VALUES
('MNS111', false),
('OJS111', true),
('MNF111', false);
INSERT INTO time_lessons (t_start, t_end ) VALUES
('2019-06-10 08:00:00', '2019-06-10 08:40:00'),
('2019-06-10 08:50:00', '2019-06-10 09:30:00'),
('2019-06-10 09:40:00', '2019-06-10 10:20:00'),
('2019-06-10 10:30:00', '2019-06-10 11:10:00'),
('2019-06-10 11:20:00', '2019-06-10 12:00:00'),
('2019-06-10 13:10:00', '2019-06-10 13:50:00'),
('2019-06-10 14:00:00', '2019-06-10 14:40:00'),
('2019-06-10 14:50:00', '2019-06-10 15:30:00'),
('2019-06-10 15:40:00', '2019-06-10 16:20:00');
INSERT INTO bookings(teachers_id ,pupils_id, cars_id, time_lessons_id) VALUES
(1,2,1,1),(2,1,1,1),
(1,2,1,2),(2,1,2,2),
(1,1,1,3),(2,2,1,3);
-- Ska ge error om man duplicerar!!
-- Find main admin
SELECT t_fname, t_lname FROM teachers WHERE auth_lvl = 1;
-- How many manual geared cars?
SELECT COUNT(*) AS manually_geared FROM cars
WHERE auto_gear = false;
-- all booked student
SELECT p_fname, p_lname FROM bookings
INNER JOIN pupils ON pupils.id = bookings.pupils_id
GROUP BY p_lname, p_fname;
-- What time will each student drive?
SELECT p_fname, p_lname, t_start, t_end FROM bookings
INNER JOIN pupils ON pupils.id = bookings.pupils_id
INNER JOIN time_lessons ON time_lessons.id = bookings.time_lessons_id
ORDER BY p_lname, p_fname, t_start;
-- All time_lessons for teacher number 1
SELECT t_fname, p_fname, p_lname, t_start, t_end FROM bookings
INNER JOIN teachers ON teachers.id = bookings.teachers_id
INNER JOIN pupils ON pupils.id = bookings.pupils_id
INNER JOIN time_lessons ON time_lessons.id = bookings.time_lessons_id
WHERE teachers.id = 1;
所以我想知道是否要更改结构?我是否缺少一些代码来使我上面提到的工作正常?
答案 0 :(得分:0)
老师不能两次教同一堂课
在UNIQUE
中的(teacher_id,time_lesson_id)
元组上添加booking
约束,例如
CREATE UNIQUE INDEX booking_UX1 ON booking (teacher_id,time_lesson_id)
这将不允许包含重复值组合的行。如果尝试INSERT
的新行(或UPDATE
和现有行)将导致两行具有相同的值,则该语句将失败,并出现错误1062“键“的重复条目”。 / p>
小学生不能两次开车上课时间
唯一索引将防止重复:
CREATE UNIQUE INDEX booking_UX2 ON booking (pupil_id,time_lesson_id)
(我希望实体表以单数命名,以命名一个行所代表的内容。)