select-tablesql的自动更新(触发)

Automatic update of select-table sql (trigger)

我正在开发一个学校的小型数据库,使用 MySQL。 我有一个 table 用于教授,带有 ID、姓名和电子邮件,还有一个 table 用于讲座,带有 ID、讲座名称和那个 class 的版本。然后,教授和讲座我都有一个中介table。

正如您在下面看到的,我的最后一个 table 包括一个用于评估的专栏。其中,教授每讲一次课都会得到一个分数。

  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));

现在,我想要教授讲课的所有 class 课程的平均评价。我用 select.

创建了一个 table
   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;  

table 有效,但它有一个问题,它显示的唯一值是在 table 之前的父 table(lecture_professor)中已经存在的值Avg_evaluation 已创建。如果我想添加新教授和新版本,table 不会自动更新。

我该如何解决这个问题?我还以为我可以做一个可更新的视图,但我不能使用像 AVG 这样的算术函数。

我想做一个触发器,因为在 lecture_professor table 上插入任何新值之后。但我不知道怎么办。

感谢您的帮助!

编辑:这里有一些虚拟值。和更正。

    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);

你需要的是插入后 trigger 你可以在下面找到语法

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');

这是你的数据和视图

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)

请注意显式连接。