1

所以基本上我试图创建一个触发器,通过添加俯卧撑、引体向上和 3 英里跑步的分数来更新我的 300challenge 表中的分数。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;

我试过SELECT直接在UPDATE wscore语句中使用替换 theselect * fom temp但它没有工作说我不能在语句内的子句中使用300challenge表。SELECT FROMUPDATE

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

但显然这种方法不足以欺骗系统,因为它现在会抛出一个错误,上面写着Explicit or implicit commit is not allowed in stored function or trigger.

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

更新:

我现在也尝试CREATE TABLE TEMP从触发器中删除,在触发器之外创建表(一次)并用drop table tempa替换触发器的最后一行truncate table temp,但显然我的网络主机不允许触发器为 TRIGGER command denied to user '--'@'localhost' for table '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;
4

2 回答 2

1

尝试将其改写为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;
于 2013-08-10T17:34:58.113 回答
0

所以,我已经设法找到了一个解决方法,如果有人有耐心阅读整个问题,如果没有,我会在这里对我的结论做一个简短的总结。

即使我设法克服了无法在语句中使用同一个表SELECT并使用语句中的值的错误,UPDATE例如

UPDATE table
SET col1 = (select max(col1) from table)

通过使用临时表。在设法为此创建正确的代码(这是我的第二个 CODE 发布)之后,在我更新的问题部分中,我仍然无法使其工作,因为我WEBHOST不允许创建触发器。

现在,作为一种解决方法,我在我的应用程序中创建了一个新网页,在将INSERTING数据写入表之后,我立即使用触发器中使用的确切代码更新了我需要的列(INSERTUPDATETRUNCATE。实际上,我将触发器的功能从数据层移到了应用程序的业务层。

我希望这可以帮助任何受其网络主机限制且无法使用其数据层的全部功能的人。

于 2013-08-11T06:54:53.083 回答