Php #1442-Can';t更新表

Php #1442-Can';t更新表,php,mysql,sql,triggers,Php,Mysql,Sql,Triggers,我已经创建了一个触发器,每次在学生分数表中插入一条新记录时,都会在最终分数列中插入所有数字的总和 当我试图在表中插入新记录时,收到以下错误消息 请告诉我哪里出错了 谢谢 塔哈 - 错误 StudentMarksId, StudentId, SemisterCourseId, 分配标记, QuizMarks, Hourly1, 小时2, Hourly3, 最终标记, 等级, 项目标记, GPA ) 价值观( 空值,'1','1','10','15','20','15','10',' ) - #14

我已经创建了一个触发器,每次在
学生分数表中插入一条新记录时,都会在
最终分数
列中插入所有数字的总和

当我试图在表中插入新记录时,收到以下错误消息

请告诉我哪里出错了

谢谢

塔哈

-

错误

StudentMarksId
StudentId
SemisterCourseId
分配标记
QuizMarks
Hourly1
小时2
Hourly3
最终标记
等级
项目标记
GPA
) 价值观( 空值,'1','1','10','15','20','15','10',' )

-

#1442-#1442-无法更新存储函数/触发器中的表“学生标记”,因为调用此存储函数/触发器的语句已使用该表。


必须手动编写PHP代码才能解决此问题


编辑1

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    INSERT INTO student_marks( FinalMarks )
    VALUES (
      AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
    )
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
它用于插入,我还想触发触发器并在老师更新任何字段标记时更新最终标记塔哈·基尔马尼

在更新之前,您还需要一个具有相同
设置
逻辑的
触发器。
但是触发器名称和类型应该不同

示例

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    INSERT INTO student_marks( FinalMarks )
    VALUES (
      AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
    )
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;

原始答案

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    INSERT INTO student_marks( FinalMarks )
    VALUES (
      AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
    )
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
似乎您希望通过对插入的值求和来设置特定字段的值。要完成此操作,不需要在表上显式执行另一条
insert
语句

相反,您可以在触发器中对字段使用
SET
命令,以便它被接受

更改

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    INSERT INTO student_marks( FinalMarks )
    VALUES (
      AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
    )
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;

DELIMITER //

CREATE DEFINER = `root`@`localhost` 
  TRIGGER `bu_student` BEFORE UPDATE ON `student_marks`
  FOR EACH ROW 
BEGIN
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
END;
//

DELIMITER ;
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    INSERT INTO student_marks( FinalMarks )
    VALUES (
      AssignmentMarks + QuizMarks + Hourly1 + Hourly2 + Hourly3 + ProjectMarks
    )
CREATE DEFINER = `root`@`localhost` 
  TRIGGER `insert_student` BEFORE INSERT ON `student_marks`
  FOR EACH ROW 
    SET NEW.FinalMarks = NEW.AssignmentMarks + NEW.QuizMarks
                       + NEW.Hourly1 + NEW.Hourly2 + NEW.Hourly3 
                       + NEW.ProjectMarks;
参考


查看同一页上“用户评论”下的一个示例。

根据我的理解,您应该使用“插入后”而不是“插入前”…仍然会收到相同的错误消息让我更正一下。您在插入前显示了一个
触发器。然后在
更新中出现错误。该触发器与错误无关。但如果我删除该触发器,它会正常工作。我认为@jmail已经回答了您的问题,实际上问题是您正在尝试更新触发器调用的同一个表。作为表上任何事件的触发器调用,它将锁定表以执行触发器中提到的任务。在这种情况下,触发器锁定表并再次尝试更新同一个表,这是不可能的。因此,您可以通过事务实现这一点。在单个事务中,首先插入行,然后更新所需列,然后执行commit语句或在失败时回滚。当我尝试在更新之前对
执行此操作时,它不生成任何错误消息,但也不工作。如果我在更新后将其更改为
,则它将停止支持
NEW
关键字。在触发之前不使用
意味着什么?发出
insert
语句时发生了什么?记录是否已存储?如果是,值是否相同?请解释。检查我的最新答案。我已经包含了
update
trigger的代码片段。以前的数据是什么?你的意见是什么?后面的数据是什么?我不确定您是如何使用PHPMyAdmin的。但为什么不在SQL编辑器中尝试一个
update
语句并提交呢。然后浏览记录,看看更新是否有效?