所以基本上我已经尝试创建一个触发器,通过添加俯卧撑、引体向上和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
中使用。
但显然,这种方法不足以欺骗系统,因为它现在抛出了一个错误,上面写着Explicit or implicit commit is not allowed in stored function or trigger.
我已经没有什么想法了,所以如果有人能提出一些建议,我们将非常欢迎。
更新:
我现在也尝试从触发器中删除CREATE TABLE TEMP
,在触发器外创建表(一次),并用truncate table temp
替换触发器的最后一行drop 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;
尝试将其重新表述为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;
因此,我已经设法找到了解决方法,如果有人有耐心阅读整个问题,如果没有,我将在这里简要总结我的结论。
尽管我设法克服了不能在SELECT
语句中使用同一个表以及像一样使用UPDATE
语句中的值的错误
UPDATE table
SET col1 = (select max(col1) from table)
通过使用临时表。在我成功创建了正确的代码(这是我第二次发布code)之后,在问题的更新部分,我仍然无法使其工作,因为我的WEBHOST
不允许创建触发器。
现在,作为解决方法,我在应用程序中创建了一个新网页,在INSERTING
数据进入表后,我立即用触发器中使用的确切代码(INSERT
、UPDATE
和TRUNCATE
)更新了所需的列。实际上,我将触发器的功能从数据层转移到了应用程序的业务层。
我希望这能帮助其他受网络主机限制、无法使用数据层全部功能的人。