簡體   English   中英

MySQL觸發器不能在UPDATE語句中使用相同的表

[英]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數據插入表我即時更新,我需要的觸發(使用的確切代碼列INSERTUPDATETRUNCATE )。 我實際上將觸發器的功能從數據層移到了應用程序的業務層。

我希望這對受其Web主機限制且無法使用其數據層的全部功能的其他人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM