Автоматическое обновление select-таблицы sql (триггер) - PullRequest
0 голосов
/ 11 января 2019

Я разрабатываю небольшую базу данных школы, используя MySQL. У меня есть таблица для профессоров, с идентификатором, именем и адресом электронной почты, и таблица для лекций, с идентификатором, названием лекции и изданием этого класса. Затем у меня есть промежуточная таблица для профессоров и лекций.

Как вы можете видеть ниже, в моей последней таблице есть столбец для оценки. Где за каждую лекцию профессор получает оценку.

  CREATE TABLE professor ( 
professor_id INT PRIMARY KEY,
professor_name VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE);

CREATE TABLE lecture (
lecture_id INT PRIMARY KEY,
lecture_name VARCHAR(50) NOT NULL,
edition INT NOT NULL);

CREATE TABLE lecture_prof (
professor_id INT,
lecture_id INT,
Evaluation INT,
FOREIGN KEY (professor_id) REFERENCES professor (professor_id),
FOREIGN KEY (lecture_id) REFERENCES lecture (lecture_id));

Теперь я хочу получить средние оценки по всем классам, которые преподают профессора. И я создал таблицу с выбором.

   CREATE TABLE Avg_Evaluation AS SELECT 
p.professor_id,p.professor_name, AVG(Evaluation) AS Avg_Eval
    FROM professor p, lecture_professor lp
    WHERE p.professor_id=lp.professor_id
    GROUP BY professor_id, professor_name;  

Таблица работает, но у нее есть проблема, единственные значения, которые она показывает, - это значения, которые уже находятся в родительской таблице (lecture_profоресурс) до создания таблицы Avg_evaluation. И если я хочу добавить новых профессоров и новые издания, таблица не обновляется автоматически.

Как я могу решить это? Я также думал, что мог бы сделать обновляемое представление, но я не могу использовать арифметические функции, такие как AVG.

Я хотел сделать триггер, потому что после вставки каких-либо новых значений в таблицу lecture_proferor. но я не знаю как.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: вот некоторые фиктивные значения. и исправления.

    INSERT INTO faculty 
VALUES
(1,'Ana ','as@email.com'), 
(2,'Peter','pt@email.com'),
(3,'Mitchel','mm@email.org');

INSERT INTO lecture VALUES (1, 'Econ', 20),(2, 'History', 1),(3, 'Social Studies', 2);

INSERT INTO lecture_professor VALUES (1,1,3),(2,1,2),(2,2,4),(2,3,4),(1,3,2),(3,1,3);

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вот ваши данные с видом

drop table if exists lecture_professor;
drop table if exists lecture,professor;

CREATE TABLE professor ( 
professor_id INT PRIMARY KEY,
professor_name VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE);

CREATE TABLE lecture (
lecture_id INT PRIMARY KEY,
lecture_name VARCHAR(50) NOT NULL,
edition INT NOT NULL);

CREATE TABLE lecture_professor (
professor_id INT,
lecture_id INT,
Evaluation INT ,
FOREIGN KEY fk1 (professor_id) REFERENCES professor (professor_id),
FOREIGN KEY fk2 (lecture_id) REFERENCES lecture (lecture_id)
);

insert into professor values
(1,'Ana ','as@email.com'), 
(2,'Peter','pt@email.com'),
(3,'Mitchel','mm@email.org');

INSERT INTO lecture VALUES (1, 'Econ', 20),(2, 'History', 1),(3, 'Social Studies', 2);

INSERT INTO lecture_professor VALUES (1,1,3),(2,1,2),(2,2,4),(2,3,4),(1,3,2),(3,1,3);

drop view if exists v;
create view v as 
SELECT p.professor_id,p.professor_name, 
        coalesce(AVG(Evaluation),0) AS Avg_Eval
FROM professor p
left join lecture_professor lp on p.professor_id = lp.professor_id
GROUP BY professor_id,p.professor_name
; 

select * from v; 

Я не знаю, почему вы не думаете, что представление не может содержать агрегатную функцию, потому что вывод выглядит хорошо для меня

+--------------+----------------+----------+
| professor_id | professor_name | Avg_Eval |
+--------------+----------------+----------+
|            1 | Ana            |   2.5000 |
|            2 | Peter          |   3.3333 |
|            3 | Mitchel        |   3.0000 |
+--------------+----------------+----------+
3 rows in set (0.00 sec)

Обратите внимание на явное соединение.

0 голосов
/ 11 января 2019

Что вам нужно после вставки Триггер Синтаксис можно найти ниже

CREATE TRIGGER trigger_name
AFTER INSERT
   ON table_name FOR EACH ROW

BEGIN

   -- variable declarations

   -- trigger code

END;

Пример: -

CREATE TRIGGER new_loaner_added 
AFTER INSERT ON total_loaner
FOR EACH ROW 
  INSERT INTO available_loaner (Kind, Type, Sno, Status)
  VALUES (NEW.Kind, NEW.Type, NEW.Sno, 'Available');
...