当前位置: 首页 > 面试题库 >

插入后和更新后的MySQL触发器

权玉泽
2023-03-14
问题内容

我有两个表,其中一个命名att如下

CREATE TABLE att (
  SID varchar(50) NOT NULL, 
  CID varchar(50) NOT NULL, 
  Date date NOT NULL,
  H1 varchar(1) NOT NULL DEFAULT 0,
  H2 varchar(1) NOT NULL DEFAULT 0,
  H3 varchar(1) NOT NULL DEFAULT 0,
  H4 varchar(1) NOT NULL DEFAULT 0,
  H5 varchar(1) NOT NULL DEFAULT 0,
  H6 varchar(1) NOT NULL DEFAULT 0,
  H7 varchar(1) NOT NULL DEFAULT 0,
  H8 varchar(1) NOT NULL DEFAULT 0,
  H9 varchar(1) NOT NULL DEFAULT 0,
  H10 varchar(1) NOT NULL DEFAULT 0,
  INDEX (SID, CID)
);

另一个表per具有以下字段:
SID CID Per

如何为以下内容编写触发器:
如果att表h1-h0的任何字段中发生
更新per,则per使用以下值更新表中的列:
((总数为1s-总数为0s / (总数1s +总数0s))/ 100

在此先感谢
我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗?

create TRIGGER `att_up` AFTER UPDATE ON `attentance`
FOR EACH ROW BEGIN
  DECLARE Zeros INT;
  DECLARE Ones INT;
  DECLARE total INT;
  DECLARE atted FLOAT;
  SELECT SUM(8-(h1+h2+h3+h4+h5+h6+h7+h8)) 
      INTO Zeros FROM attentance 
      WHERE StudID=NEW.StudID;
  SELECT SUM(h1+h2+h3+h4+h5+h6+h7+h8) 
      INTO Ones FROM attentance 
      WHERE StudID=NEW.StudID;
  SELECT SUM(8-(h1+h2+h3+h4+h5+h6+h7+h8))+ SUM(h1+h2+h3+h4+h5+h6+h7+h8) 
      INTO total FROM attentance 
      WHERE StudID=NEW.StudID;
  set atted=((ZEROS-Ones)/total)/100;
  INSERT into per(per) values (atted);
END$$

问题答案:

在定义触发器之前,请确保更改定界符。另外,在创建表和触发器时,请确保使用相同的表名和列名(在示例中使用的是attattendance,以及SIDStudID)。

实际上,设置分隔符后,在MySQL 5.1.55中对触发器定义进行测试时,触发器定义没有引起任何错误。

delimiter $$
CREATE TRIGGER `att_up` 
  AFTER UPDATE ON `attendance`
FOR EACH ROW 
BEGIN
  DECLARE Zeros INT;
  DECLARE Ones INT;
  DECLARE total INT;
  DECLARE attend FLOAT;
  SELECT SUM(8-(h1+h2+h3+h4+h5+h6+h7+h8)), 
         SUM(h1+h2+h3+h4+h5+h6+h7+h8),
         SUM(8-(h1+h2+h3+h4+h5+h6+h7+h8)) + SUM(h1+h2+h3+h4+h5+h6+h7+h8)
    INTO Zeros, Ones, Total FROM attendance 
    WHERE SID=NEW.SID;
  SET attend=((Zeros-Ones)/total)/100;
  INSERT INTO per (SID, CID, per) values (NEW.SID, NEW.CID, attend)
    ON DUPLICATE KEY UPDATE per=attend;
END$$
delimiter ;


 类似资料:
  • 问题内容: 这是我想做的事情: 当表中有新记录时,我需要通过设置以表示特定(旧)帐户已被编辑来更新where =中的行。 要求 不是 我要操纵 新插入的 列,而是要使用一个 已经存在的 列 但是,我无法更新同一张表: 请提出解决方法 PS:我已经走过了更新表触发器在同一个表更新后,插入到相同的表触发的mysql,更新与后同桌INSERT触发器和表后插入MySQL的触发器与插入和更新,但他们似乎没有

  • 以下是我想做的: 当表中有新的 时,我需要通过设置 ' 来更新中的行 = ,以表示特定(旧)帐户已被编辑。 要求不是操作新插入的列,而是使用< code>pk = NEW.edit_on操作已经存在的列 但是,我无法更新同一个表: 请建议一个解决方法 PS:我已经完成了更新同一表后在触发器中更新表、插入到同一表中触发器mysql、在同一表上用插入后触发器更新以及在表上用Insert和update在

  • 问题内容: 我的数据库中有一个计算,需要在更新触发器之后为“ table1”更新“ field1”。 更新该字段的问题将导致更新后触发器触发并执行冗长的过程并显示错误。 请告知在执行“更新后”触发器之后如何使“ field1”更新,而又不使“更新后”触发器再次执行。 我知道我不能将After触发器与NEW配合使用。 谢谢 问题答案: 可以使用基于上下文变量的自定义锁定机制,以防止重复调用AFTER

  • 问题内容: 我正在尝试编写触发器,我有下表:BookingRequest: 状态表: 被占领的房间: 我需要一个触发器,如果​​将具有相同ID的请求插入到OccupiedRoom表中,它将把BookingReques中的状态更改为1,所以我尝试了类似的操作 而且它不起作用,所以任何建议都非常有用 问题答案: 尝试这个:

  • 问题内容: 是否可以为表的插入和更新事件触发mysql触发器? 我知道我可以做到以下几点 但是我该怎么办 是否可以,或者我必须使用2个触发器?两者的代码都相同,我不想重复。 问题答案: 您必须创建两个触发器,但是您可以将通用代码移动到过程中并使它们都调用过程。

  • 如果我分别创建这两个MySQL触发器,两个触发器都执行OK。但我无法将它们组合起来,使其能够乘以持续时间x速率。 如果存在,则删除触发器;为每一行更新后创建definer=@TRIGGERSET@rate=(从语言中选择速率,其中languages.idlanguages=contracts.languages_idlanguagejes); 如果存在,则删除触发器;CREATE definer=