【问题标题】:Automatic update of select-table sql (trigger)select-table sql的自动更新(触发器)
【发布时间】:2019-06-06 10:08:04
【问题描述】:

我正在开发一个学校的小型数据库,使用 MySQL。 我有一张教授表,上面有 id、姓名和电子邮件,还有一张讲座表,上面有 id、讲座名称和该课程的版本。然后,我有一个教授和讲座的中间表。

正如您在下面看到的,我的最后一个表格包含一个用于评估的列。其中,对于每堂课,教授都会获得一个分数。

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

现在,我想要教授教授的所有课程的平均评价。我用 select 创建了一个表。

   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;  

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

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

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

感谢您的帮助!

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

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

【问题讨论】:

  • 一些代码批评 - 1) 与 group by 不同是没有意义的,因为 group by 将返回 1 行每个 p.professor_id,p.professor_name 2) Group by 应该包括两个选定的列 p.professor_id ,p.professor_name 3) 使用显式而不是隐式连接 4) 为可以计算的东西创建表通常不是一个好主意,在这种情况下,如果平均值可能会发生变化,可能会导致维护问题如果教授积累了更多的讲座。
  • @P.Salmon 谢谢你的建议,我会采纳的。但我不明白 3。另外,如果创建表不是最好的主意,我该如何解决我的问题?
  • 好的,将一些示例数据作为文本添加到您的问题中。
  • @P.Salmon 我将一些示例值作为代码放置(这更容易,因为我目前正在测试一些选项)。谢谢!

标签: mysql select triggers insert-update


【解决方案1】:

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

【讨论】:

  • 谢谢,你能帮我写出这个特定场景的代码吗?
【解决方案2】:

这是带有视图的数据

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)

请注意显式连接。

【讨论】:

  • 因为我读到可更新的视图在这里不能有算术函数:mysqltutorial.org/create-sql-updatable-views.aspx。但是我在 Lecture_professor 表中添加了新值,并且视图确实更新了新值,除了 avg。返回零。这是我使用的新值:`插入教授值(4,'Mitchaela','mma@email.org');插入讲座价值观(4,“西班牙语”,2);从 v 中选择 *; `
  • 您是正确的,可更新视图不​​能包含 group by ,我认为视图不必是可更新的。
  • Mitchaela 的平均值为 0 是正确的,这位教授没有任何评估 - 你期望平均值是多少。
  • 你是对的!那行得通,我只是在我的代码中有一个小错误。非常感谢您的意见!
  • 正是我忘记添加评估值。对不起!
猜你喜欢
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2016-11-03
  • 2021-03-04
  • 2011-06-03
相关资源
最近更新 更多