自动更新选择表SQL(触发器)

时间:2019-01-11 13:15:30

标签: mysql select triggers insert-update

我正在使用MySQL开发学校的小型数据库。 我有一张教授用的桌子,带有ID,名称和电子邮件,还有一张演讲用的桌子,带有ID,演讲名称和该班的版本。然后,我有一个教授和讲座的中间表。

在下面您可以看到,我的上一张表包括一列用于评估的列。在哪里,每一次讲座教授都会得到一个分数。

<div id="tree"></div>

现在,我希望对教授讲授的所有课程进行平均评估。我用select创建了一个表。

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

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

我该如何解决?我还认为我可以进行可更新的视图,但是不能使用AVG之类的算术函数。

我想在将所有新值插入演讲者教授表之后执行一个触发器。但我不知道如何。

谢谢您的帮助!

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

   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;  

2 个答案:

答案 0 :(得分:0)

您需要的是插入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');

答案 1 :(得分:0)

这是您的数据视图

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)

请注意显式联接。