【问题标题】:mysql after insert trigger which updates another table's column插入触发器后的mysql更新另一个表的列
【发布时间】:2015-07-22 21:42:59
【问题描述】:

我正在尝试编写触发器,我有以下表格: 预订请求:

  +-----------+---------+------+-----+---------+----------------+
    | Field     | Type    | Null | Key | Default | Extra          |
    +-----------+---------+------+-----+---------+----------------+
    | idRequest | int(11) | NO   | PRI | NULL    | auto_increment |
    | roomClass | int(11) | NO   |     | NULL    |                |
    | inDate    | date    | NO   |     | NULL    |                |
    | outDate   | date    | NO   |     | NULL    |                |
    | numOfBeds | int(11) | NO   |     | NULL    |                |
    | status    | int(11) | NO   | MUL | NULL    |                |
    | idUser    | int(11) | NO   | MUL | NULL    |                |
    +-----------+---------+------+-----+---------+----------------+

状态表:

+------------+--------------------------------------------------+------+-----+---------+-------+
| Field      | Type                                             | Null | Key | Default | Extra |
+------------+--------------------------------------------------+------+-----+---------+-------+
| idStatus   | int(11)                                          | NO   | PRI | NULL    |       |
| nameStatus | enum('underConsideration','approved','rejected') | YES  |     | NULL    |       |
+------------+--------------------------------------------------+------+-----+---------+-------+

占用房间:

+--------------+---------+------+-----+---------+----------------+
| Field        | Type    | Null | Key | Default | Extra          |
+--------------+---------+------+-----+---------+----------------+
| idOccupation | int(11) | NO   | PRI | NULL    | auto_increment |
| idRoom       | int(11) | NO   |     | NULL    |                |
| idRequest    | int(11) | NO   |     | NULL    |                |
+--------------+---------+------+-----+---------+----------------+

如果将具有相同 id 的请求插入到 OccupiedRoom 表中,我需要一个触发器,它将 BookingReques 中的状态更改为 1,所以我尝试了类似的方法

create trigger occupy_trig after insert on OccupiedRoom 
for each row
begin
  if BookingRequest.idRequest= NEW.idRequest
   then
       update BookingRequest
       set status = '1';
       where idRequest = NEW.idRequest;

    end if;
END;

它不起作用,所以任何建议都会非常受欢迎

【问题讨论】:

  • 删除set status ='1'之后的分号应该这样做

标签: mysql sql-update triggers


【解决方案1】:

试试这个:

DELIMITER $$
CREATE TRIGGER occupy_trig
AFTER INSERT ON `OccupiedRoom` FOR EACH ROW
begin
       DECLARE id_exists Boolean;
       -- Check BookingRequest table
       SELECT 1
       INTO @id_exists
       FROM BookingRequest
       WHERE BookingRequest.idRequest= NEW.idRequest;

       IF @id_exists = 1
       THEN
           UPDATE BookingRequest
           SET status = '1'
           WHERE idRequest = NEW.idRequest;
        END IF;
END;
$$
DELIMITER ;

【讨论】:

  • 这个答案是我在 Stack Overflow 上为我的问题找到的最佳答案。谢谢。
【解决方案2】:

根据您的要求,您的触发器中不需要BEGIN ENDIF 以及不必要的SELECT。所以你可以把它简化成这样

CREATE TRIGGER occupy_trig AFTER INSERT ON occupiedroom 
FOR EACH ROW
  UPDATE BookingRequest
     SET status = 1
   WHERE idRequest = NEW.idRequest;

【讨论】:

  • @DeadKennedy 为什么不把它作为公认的答案?这将有助于其他人查看此答案。
  • 是的,在我看来,这应该是公认的答案。
  • 当我尝试在 WHERE 行上使用此代码时出现语法错误:drop trigger if exists actualizaDataApto; CREATE TRIGGER actualizaDataApto AFTER INSERT ON doacao FOR EACH ROW UPDATE doador SET Data_Apto = DATE_ADD(Data_Apto, INTERVAL 3 MONTH); WHERE doador.id_Doador = NEW.Doador_id_Doador; 你能帮帮我吗?
  • @C.Rib 评论部分不是一个好地方。请发布适当的问题,我或其他 SO 成员将很乐意为您提供帮助。
【解决方案3】:

也许在 set 之后删除分号,因为现在 where 语句不属于 update 语句。 idRequest 也可能是个问题,最好写BookingRequest.idRequest

【讨论】:

  • 您无法在AFTER 触发器中更改它的值。但是您仍然可以使用它来更新另一个表。
【解决方案4】:
DELIMITER //

CREATE TRIGGER contacts_after_insert
AFTER INSERT
   ON contacts FOR EACH ROW

BEGIN

   DECLARE vUser varchar(50);

   -- Find username of person performing the INSERT into table
   SELECT USER() INTO vUser;

   -- Insert record into audit table
   INSERT INTO contacts_audit
   ( contact_id,
     deleted_date,
     deleted_by)
   VALUES
   ( NEW.contact_id,
     SYSDATE(),
     vUser );

END; //

DELIMITER ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多