用mysql建立一DML触发器,每当学生的成绩发生更新时,检查更新的学号是否满足0-100分之间,如果不满足则不允许更新,如满足则将更新的学号,成绩存入g_log表内
时间: 2023-12-27 11:04:34 浏览: 30
可以使用以下 SQL 语句在 MySQL 中创建该 DML 触发器:
```
CREATE TRIGGER trig_update_score
BEFORE UPDATE ON student
FOR EACH ROW
BEGIN
DECLARE s_score INT;
SELECT NEW.score INTO s_score;
IF s_score < 0 OR s_score > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Score out of range!';
ELSE
INSERT INTO g_log (s_id, s_score)
VALUES (NEW.s_id, s_score);
END IF;
END;
```
该触发器会在每次更新学生表(`student`)中的成绩字段(`score`)时触发。首先会将即将更新的成绩值存储到一个变量 `s_score` 中,然后判断该成绩是否在 0 到 100 分之间。如果不在该范围内,则会抛出一个异常,阻止更新操作。如果成绩在范围内,则将该学号和成绩插入到 `g_log` 表中。
相关问题
☆建立一DML触发器,每当学生的成绩发生更新时,检查更新的学号是否满足0-100分之间,如果不满足则不允许更新,如满足则将更新的学号,成绩存入g-log表内
好的,以下是建立DML触发器的SQL语句,它可以实现你的需求:
```sql
CREATE OR REPLACE TRIGGER trg_update_student_score
AFTER UPDATE ON student
FOR EACH ROW
DECLARE
v_score NUMBER;
BEGIN
-- 获取更新后的成绩
v_score := :NEW.score;
-- 判断成绩是否在0-100分之间
IF v_score < 0 OR v_score > 100 THEN
-- 如果不满足条件则不允许更新
RAISE_APPLICATION_ERROR(-20001, '成绩必须在0-100分之间!');
ELSE
-- 如果满足条件则将更新的学号、成绩存入g-log表内
INSERT INTO g_log(student_id, score) VALUES(:NEW.student_id, v_score);
END IF;
END;
```
这个触发器会在每次更新学生表时被触发,然后检查更新的成绩是否在0-100分之间,如果不在则会抛出一个应用程序错误,否则会将更新的学号和成绩存入g-log表内。注意,这个触发器是针对学生表的更新操作,所以需要在学生表上建立。
1)定义S, C表,定义实体完整性约束,定义学生的年龄在19到22岁之间,课程名唯一的约束 2)在C表中增加cpno字段,cpno字段为先修课号,定义cpno为外码,参照C表的cno,并定义当删除被参照表中相关记录时,要求违约处理方式为拒绝。 3)定义SC表的实体集参照完整性约束,要求当其被参照表发生删除操作时,S表违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。 3)触发器 ☆建立一DML触发器,每当学生的成绩发生更新时,检查更新的学号是否满足0-100分之间,如果不满足则不允许更新,如满足则将更新的学号,成绩存入g-log表内 ☆建立一个INSTEAD OF触发器,一次只允许删除一条记录每当删除课程表中的记录超过一条时,则不允许删除,且给出提示信息“删除记录一次不可超过一条”
好的,以下是SQL命令实现你需要的实验内容:
1) 定义S, C表,定义实体完整性约束,定义学生的年龄在19到22岁之间,课程名唯一的约束
```sql
CREATE TABLE S (
Sno CHAR(10) PRIMARY KEY,
Sname VARCHAR(20) NOT NULL,
Ssex CHAR(2) NOT NULL,
Sage INT CHECK (Sage BETWEEN 19 AND 22),
Sdept VARCHAR(20) NOT NULL
);
CREATE TABLE C (
Cno CHAR(4) PRIMARY KEY,
Cname VARCHAR(20) NOT NULL UNIQUE,
Cpno CHAR(4),
FOREIGN KEY (Cpno) REFERENCES C(Cno) ON DELETE NO ACTION ON UPDATE CASCADE
);
```
2) 在C表中增加cpno字段,cpno字段为先修课号,定义cpno为外码,参照C表的cno,并定义当删除被参照表中相关记录时,要求违约处理方式为拒绝。
```sql
ALTER TABLE C ADD Cpno CHAR(4);
ALTER TABLE C ADD CONSTRAINT fk_Cpno_Cno FOREIGN KEY (Cpno) REFERENCES C(Cno) ON DELETE RESTRICT ON UPDATE CASCADE;
```
3) 定义SC表的实体集参照完整性约束,要求当其被参照表发生删除操作时,S表违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。
```sql
CREATE TABLE SC (
Sno CHAR(10),
Cno CHAR(4),
Grade INT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES S(Sno) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (Cno) REFERENCES C(Cno) ON DELETE CASCADE ON UPDATE RESTRICT
);
```
4) 触发器
- 建立一DML触发器,每当学生的成绩发生更新时,检查更新的学号是否满足0-100分之间,如果不满足则不允许更新,如满足则将更新的学号,成绩存入g-log表内
```sql
CREATE TABLE g_log (
Sno CHAR(10),
Cno CHAR(4),
Grade INT,
Update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER tr_check_grade
AFTER UPDATE ON SC
FOR EACH ROW
BEGIN
IF NEW.Grade < 0 OR NEW.Grade > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Grade must be between 0 and 100';
ELSE
INSERT INTO g_log (Sno, Cno, Grade) VALUES (NEW.Sno, NEW.Cno, NEW.Grade);
END IF;
END;
```
- 建立一个INSTEAD OF触发器,一次只允许删除一条记录每当删除课程表中的记录超过一条时,则不允许删除,且给出提示信息“删除记录一次不可超过一条”
```sql
CREATE TRIGGER tr_delete_c
INSTEAD OF DELETE ON C
FOR EACH ROW
BEGIN
IF ROW_COUNT() > 1 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete more than one record at a time';
ELSE
DELETE FROM C WHERE Cno = OLD.Cno;
END IF;
END;
```