I try to automate the copy-row from a collection-table to a dedicated table. Sometimes the dedicated table does not exist, therefor I check for existance, and if needed I create the table before copying the row. This code is included in a trigger in MariaDB
From the latest inserted row in the table "allwelds" I want to know the content of the column ProjectName, the complete row have to be inserted in the table with the name of the ProjectName First I check the existance of the table. If the table does not exist (select returns 0 ), I create the table with the name of the variable "qname" and insert the complete row in it. If the table exist (select returns 1 ) do the insert of the row in the table with the name of the variable "qname"
The following code results in the following error:
MySQL #1422 Explicit or implecit commit is not allowed in stored function or trigger
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
Can anyone help me with this code?
There is another problem waiting to be discovered.
qnameis dynamic, yet you haveINSERT INTO qname ..., which is using "qname" as a static table name. The obvious solution isCONCAT,PREPARE,EXECUTE, etc. But, let's not go that way.Do not create lots of tables with the same schema. This is almost always a bad design and a maintenance nightmare, and sometimes a performance problem.
Instead, have an extra column in a single table for throwing the stuff into. And put
qnamein that column. Probably the first part of the compositePRIMARY KEYfor that table would beqname.Another problem... Don't discover the columns via a
SELECTandMAX(id). Instead, use the pseudo tableOLD(there is alsoNEW). It is a lot simpler and faster. Plus it avoids race conditions whereMAX(id)could grab the id from a different connection !Bottom line: Take the time to study
TRIGGERsand look at examples.