【问题标题】:MySQL Trigger won't update rows when data inserted插入数据时,MySQL触发器不会更新行
【发布时间】:2021-04-13 02:41:41
【问题描述】:

我目前正在为学校数据库做大学作业。我正在使用 MySQL。我有一个学生表,该表链接到贷款表,以确定学生根据学生类型获得的贷款。我想创建一个触发器,根据给定的student_code 更新loan_id。到目前为止,我有这个触发器:

DELIMITER |

CREATE TRIGGER student_loan_insert_update
    AFTER INSERT
    ON student
    FOR EACH ROW 
    BEGIN
        DECLARE student_code VARCHAR(10);
        SET student_code = (SELECT student_code FROM student LIMIT 1);
    
        IF student_code = "F" THEN
            UPDATE student SET student.loan_id = "LN1" WHERE student_code = NEW.student_code;
        ELSEIF student_code = "FI" THEN
            UPDATE student SET student.loan_id = "LN2" WHERE student_code = NEW.student_code;
        ELSEIF student_code = "D" THEN
            UPDATE student SET student.loan_id = "LN3" WHERE student_code = NEW.student_code;
        ELSEIF student_code = "DI" THEN
            UPDATE student SET student.loan_id = "LN4" WHERE student_code = NEW.student_code;
        END IF;
    END;
|
DELIMITER ;

它不会抛出任何错误,但是当我插入数据时,学生loan_ids 没有任何变化,只是保持为 LN1。 (见下方插入数据):

INSERT INTO `student` (`student_id`,`curriculum_id`,`loan_id`,`student_forename`,`student_surname`,`student_code`,`student_dob`,`student_address`,`student_city`,`student_postcode`,`student_email`,`student_tele`,`student_fee_paid_td`) VALUES 
    ("P1","CR1","LN1","Axel","Prince","F","2003-02-21","8 Nascetur St.","Erchie","D6 1XK","massa.Vestibulum@Integer.edu","+44 5610 275457",7459),
    ("P2","CR5","LN1","Howard","Thomas","F","2004-10-09","7 Nunc. Avenue","Bogor","H4Q 9MZ","Pellentesque.tempus@nisi.edu","+44 1672 205594",7689),
    ("P3","CR1","LN1","Nathan","Elliott","F","2004-08-04","6 Eu St.","Bierges","US6 0TC","diam@vitaenibh.ca","+44 1300 961375",4260),
    ("P4","CR6","LN1","Piper","Torres","F","2002-05-21","3 Felis. Rd.","Khuzdar","ZI0 7QI","id@dapibusquam.net","+44 6152 201055",1209),
    ("P5","CR2","LN1","Ralph","Mayo","F","2004-03-27","5 Praesent Av.","Lakeland","SZ7 5RJ","sit.amet@nummy.net","+44 0910 033565",1178),
    ("P6","CR1","LN1","Cade","Soto","FI","2002-05-10","3 Turpis St.","Saint-Oyen","RL4 2LC","Integermagna@vulputate.co.uk","+44 5197 328908",6640),
    ("P7","CR3","LN1","Erin","Gordon","FI","2003-09-30","1 A Avenue","Brussel","V7U 4DF","dapibus.id@nuncestmollis.com","+44 5774 181109",2285),
    ("P8","CR6","LN1","Kibo","Roy","FI","2003-03-12","7 At, Street","León","E4H 8YD","cursus@Crasvulputate.ca","+44 8826 578883",6967),
    ("P9","CR6","LN1","Petra","Haney","FI","2002-07-14","6 Risus. Rd.","Silvassa","G87 8NW","at.lacus.Quisque@ante.com","+44 4238 118987",3913),
    ("P10","CR5","LN1","Sage","Cleveland","FI","2002-06-03","2 Sapien, Rd.","Birmingham","S14 8QF","lectus@facilisis.edu","+44 2191 821405",5159),
    ("P11","CR4","LN1","Dakota","Hancock","D","2003-10-15","6 Elit Avenue","Fratta","S2C 0IG","tortor@semqueut.org","+44 7220 779001",5391),
    ("P12","CR6","LN1","Elaine","Chan","D","2004-11-15","9 Quis Street","Opprebais","J1H 8YT","Integer@curmagna.com","+44 0327 426178",8665),
    ("P13","CR7","LN1","Steven","Woodard","D","2004-07-26","2 Volutpat Av.","Oamaru","MK9 4CY","augue.ac@Nulla.net","+44 2598 340795",4082),
    ("P14","CR6","LN1","Mannix","Buckner","D","2003-09-30","4 Donec Rd.","Helensburgh","H9B 2UH","Donec@ut.ca","+44 4133 663174",6748),
    ("P15","CR6","LN1","Hadassah","Wise","D","2002-09-24","3 Quisque Ave","Haverfordwest","IL9X 4CJ","Morbi.neque@eleifendnon.ca","+44 0564 934110",7268),
    ("P16","CR1","LN1","Kyra","Joseph","DI","2003-12-09","5 Neque. St.","Greifswald","NM7Q 6PS","Morbi@a.edu","+44 2011 247324",1655),
    ("P17","CR3","LN1","Claire","Aguilar","DI","2002-01-27","3 Aliquam Av.","Schoonaarde","N8 3QT","sollicitudin@Seddiamlorem.org","+44 9416 497087",1430),
    ("P18","CR1","LN1","Geoffrey","Morrison","DI","2002-01-13","9 Lectus Rd.","Cardiff","ZM18 2KM","id@sedpedeCum.net","+44 7470 007536",4694),
    ("P19","CR2","LN1","Tallulah","Jarvis","DI","2002-07-13","7 Nec Rd.","Wha Ti","M1J 0YQ","rutrum.Praesent@ornareIn.ca","+44 8973 483491",7065),
    ("P20","CR1","LN1","Malik","Davis","DI","2004-09-28","3 Amet Av.","Pont-Saint-Martin","JG43 8WH","aliquet@tortorquam.org","+44 5505 920997",4232);

关于更多信息,这里是贷款插入数据:

INSERT INTO loan VALUES 
    ("LN1",  "Full-time home student", "6000.00"),
    ("LN2", "Full-time international student", "9000.00"),
    ("LN3", "Distance-learning home student", "3000.00"),
    ("LN4",  "Distance-learning international student", "6000.00");

我不确定我是否在触发器中执行了错误的 IF 语句,或者在任何地方弄乱了语法,但我们将不胜感激。

提前致谢!

编辑:这是学生 CREATE 脚本

CREATE TABLE student (
    student_id VARCHAR(7) NOT NULL,
    curriculum_id VARCHAR(7) NOT NULL,
    loan_id VARCHAR(7) NOT NULL,
    student_forename VARCHAR(10) NOT NULL,
    student_surname VARCHAR(10) NOT NULL,
    student_code VARCHAR(10) NOT NULL,
    student_dob DATE NOT NULL,
    student_address VARCHAR(20) NOT NULL,
    student_city VARCHAR(20) NOT NULL,
    student_postcode VARCHAR(10) NOT NULL,
    student_email VARCHAR(30) NOT NULL,
    student_tele VARCHAR(20) NOT NULL,
    student_fee_paid_td DECIMAL(7,2) NOT NULL,
    PRIMARY KEY (student_id),
    CONSTRAINT student_curriculum_fk FOREIGN KEY (curriculum_id) REFERENCES curriculum(curriculum_id),
    CONSTRAINT student_loan_fk FOREIGN KEY (loan_id) REFERENCES loan(loan_id),
    CONSTRAINT limit_student_codes CHECK (student_code = "F" OR student_code = "FI" OR student_code = "D" OR student_code = "DI")
);

还有表的output

【问题讨论】:

  • 你能做一个SHOW CREATE TABLE student; 并加载并复制/粘贴输出到你的问题
  • 您好,感谢您的快速回复。我已将脚本添加到帖子中。
  • 你不能在触发器中操作触发触发器的表。你可以设置NEW。插入前触发器中的值。 SET student_code = (SELECT student_code FROM student LIMIT 1);在这种情况下没有意义这里的关键词是 FOR EACH ROW
  • 嗨,P.Salmon,您能详细说明一下吗?我不完全确定你的意思,抱歉。

标签: mysql sql database triggers


【解决方案1】:

作为一般规则,当您想要更新正在插入的行时,您需要一个 before 插入触发器。

此外,您可以通过使用case 而不是使用if 的单个语句来执行此操作。所以,我建议这样的逻辑:

CREATE TRIGGER student_loan_insert_update BEFORE INSERT ON student
FOR EACH ROW 
BEGIN
    SET NEW.load_id = (CASE WHEN NEW.load_id = 'F'  THEN 'LN1'
                            WHEN NEW.load_id = 'FI' THEN 'LN2'
                            WHEN NEW.load_id = 'D'  THEN 'LN3'
                            WHEN NEW.load_id = 'DI' THEN 'LN4'
                            ELSE NEW.load_id
                       END);
END;

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 2016-10-13
    • 2013-06-11
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多