2017-01-09 168 views
0

我嘗試將集合表中的副本行自動化爲專用表。 有時專用表不存在,因此我檢查是否存在,如果需要,我在複製該行之前創建表。 此代碼包含在MariaDB的MySQL#1422在存儲函數或觸發器中不允許顯式或實施提交

從表「allwelds」我想知道列項目名的內容最新的插排的觸發器,完整的行必須在表中插入的名稱ProjectName 首先我檢查表格的存在。 如果該表不存在(選擇返回0),我使用變量名稱「qname」創建表並在其中插入完整的行。 如果表中存在(select返回1)與變量「qname的」

下面的代碼會導致以下錯誤的名所行的行插入表中:
MySQL的#1422顯式或implecit承諾不允許存儲的功能或觸發器

BEGIN 
DECLARE qname Varchar(24) DEFAULT "EMPTY"; 
DECLARE qid INT DEFAULT 0; 
DECLARE table_exist INT DEFAULT 5;   

SELECT id, ProjectName INTO qid, qname FROM allwelds WHERE id = (SELECT MAX(id) FROM allwelds); 

SELECT count(*) into table_exist FROM information_schema.TABLES WHERE (TABLE_SCHEMA = 'ugm') AND (TABLE_NAME = qname); 
CASE table_exist 

WHEN 0 THEN 
    CREATE TABLE qname (id int, Datum date, Tijd time, ProjectName Varchar(24), ...........etc, etc, .......................); 
    INSERT INTO qname (id, Datum, Tijd, ProjectName, , ...........etc, etc, .......................) 
     SELECT id, date(timestamp), time(timestamp), , ...........etc, etc, .......................); FROM `allwelds` WHERE id = qid; 

WHEN 1 THEN 
    INSERT INTO qname (id, Datum, Tijd, ProjectName, , ...........etc, etc, .......................) 
    SELECT id, date(timestamp), time(timestamp), , ...........etc, etc, .......................); FROM `allwelds` WHERE id = qid; 

END CASE; 
END 

任何人都可以使用這段代碼嗎?

+1

創建一個表涉及一個隱式提交...你不能從觸發器創建一個表 –

+0

你的第一句話是顯示實際的問題 - 在SQL中,你不檢查表是否存在 - 你認爲它確實存在。如果它不存在,則會通過從數據庫中創建表獲得一個您不能從中恢復的錯誤。我明白,儘量避免麻煩,但動態創建表格不是答案。它不可維護,它包含魔法,它可能是調試的噩夢。如果你簡單地假設表格存在,你的問題就會消失。如果沒有 - 你的系統需要某種遷移腳本,它將在第一次運行時創建表格。 – Mjh

回答

1

還有一個等待發現的問題。 qname是動態的,但你有INSERT INTO qname ...,它使用「qname」作爲靜態表名。明顯的解決方案是CONCAT,PREPARE,EXECUTE等。但是,讓我們不要這樣。

不要使用相同模式創建大量表。這幾乎總是一個糟糕的設計和維護噩夢,有時甚至是性能問題。

取而代之的是,在單個表中添加一個額外的列,以便將其填入。並在該列中輸入qname。該表格的第一部分可能是qname

另一個問題...不要通過SELECTMAX(id)發現列。相反,使用僞表OLD(也有NEW)。它更簡單快捷。另外它可以避免競爭條件,MAX(id)可以從不同的連接中獲取ID!

底線:花時間學習TRIGGERs並查看示例。

+0

謝謝你的寶貴意見。我現在意識到這是一種「快捷而骯髒」的工作方式。請你可以解釋一下最近的評論。我不理解你關於僞表 –

+0

的陳述「在觸發器主體中,OLD和NEW關鍵字使您能夠訪問受觸發影響的行中的列。」 - http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html閱讀該頁面的其餘部分。 –

相關問題