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)
请注意显式连接。
我正在开发一个学校的小型数据库,使用 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)
请注意显式连接。