MySQL 触发器不能在 UPDATE 语句中使用同一个表

标签 mysql triggers

基本上,我尝试创建一个触发器,通过添加俯卧撑、引体向上和 3 英里运行的分数来更新我的 300 挑战表中的分数。 3 英里运行的分数在下面的大 SELECT 中。

create trigger update_wscore
AFTER INSERT
ON 300challenge FOR EACH ROW

Create table temp(3mile_score integer);
insert into temp(3mile_score) 
select 
  case 
    WHEN TIMEDIFF (3mile , '00:18:00') > '00:00:10' 
      THEN
         CASE 
            WHEN
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (3mile, '00:18:00')) / 10)) < 0
            THEN 0
         ELSE 
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (3mile, '00:18:00')) / 10))
         END
  ELSE 100
END
FROM 300challenge
WHERE wscore IS NULL;

UPDATE 300challenge
SET wscore = pushups * 2 + pullups * 5 + (select * from temp);

drop table temp;

我已经尝试在 UPDATE wscore 语句中直接使用 SELECT 替换 select * fom temp 但它不起作用说我不能在 UPDATE 语句内的 SELECT FROM 子句中使用 300challenge 表。

之后,我尝试了上面当前显示的内容,创建了一个临时表,我在其中转储分数,他们读取它以便在 UPDATE 中使用。

但显然这种方法不足以欺骗系统,因为它现在会抛出一个错误,指出 存储函数或触发器中不允许显式或隐式提交。

我的想法有点用完了,所以如果有人能提出一些建议,我们将非常欢迎。

更新:

我现在也尝试从触发器中删除 CREATE TABLE TEMP,在触发器外部创建表(一次)并替换触发器的最后一行,drop table temptruncate table temp,但显然我的网络主机不允许触发器作为 TRIGGER 命令拒绝用户 '--'@'localhost' 用于表 '300challenge'

我的代码现在是这样的

CREATE TABLE TEMP (3mile_score INT);

CREATE TRIGGER update_wscore
AFTER INSERT ON 300 challenge
FOR EACH ROW

INSERT INTO TEMP (3mile_score)
SELECT CASE 
    WHEN TIMEDIFF(3mile, '00:18:00') > '00:00:10'
      THEN CASE 
          WHEN 100 - (EXTRACT(MINUTE FROM TIMEDIFF(3mile, '00:18:00')) * 6 +
               FLOOR(EXTRACT(SECOND FROM TIMEDIFF(3mile, '00:18:00')) / 10)) < 0
            THEN 0
          ELSE 100 - (EXTRACT(MINUTE FROM TIMEDIFF(3mile, '00:18:00')) * 6 +
               FLOOR(EXTRACT(SECOND FROM TIMEDIFF(3mile, '00:18:00')) / 10))
          END
    ELSE 100
    END
FROM 300 challenge
WHERE wscore IS NULL;

UPDATE 300 challenge
SET wscore = pushups * 2 + pullups * 5 + (
    SELECT *
    FROM TEMP
    );

TRUNCATE TABLE TEMP;

最佳答案

尝试将其改写为 before insert 触发器并修改 new 记录中的值。

触发器的内部是这样的:

SET new.wscore = old.pushups * 2 + old.pullups * 5 +
    case 
    WHEN TIMEDIFF (old.3mile , '00:18:00') > '00:00:10' 
      THEN
         CASE 
            WHEN
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (old.3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (old.3mile, '00:18:00')) / 10)) < 0
            THEN 0
         ELSE 
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (old.3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (old.3mile, '00:18:00')) / 10))
         END
  ELSE 100
END;

关于MySQL 触发器不能在 UPDATE 语句中使用同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164557/

相关文章:

mysql - 插入触发器更新某些列

mysql - 无法登录MySQL服务器(XAMPP)

sql - 将 SQL 查询保存到变量

Oracle:自增触发器。

php - ID 的唯一性

sql - 当某些列 = 0 时动态删除记录;数据清理

c# - WPF 用户控件;触发器和更改其他控件

mysql - 从 MySQL 转储文件恢复存储过程时出现错误 1115

php - 我可以在插入时比较 php 日期与 mysql 日期吗?

php - 在哪里以及如何存储汇率?