![](/img/trans.png)
[英]mySQL trigger cannot update table already in use by the statement that invoked the trigger
[英]MySQL trigger cannot use the same table in UPDATE statement
因此,基本上,我嘗試創建一個觸發器,通過添加俯卧撐,引體向上和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
觸發器中刪除CREATE TABLE TEMP
,在觸發器外部創建表(一次),並將觸發器的最后一行替換為truncate table temp
drop table temp
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;
嘗試將其改寫為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
)。 我實際上將觸發器的功能從數據層移到了應用程序的業務層。
我希望這對受其Web主機限制且無法使用其數據層的全部功能的其他人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.