MySQL#1422在存储函数或触发器

时间:2017-01-09 13:51:49

标签: mysql mariadb eventtrigger

我尝试将副本行从集合表自动化到专用表。 有时专用表不存在,因此我检查是否存在,如果需要,我在复制行之前创建表。 此代码包含在MariaDB的触发器中

从表“allwelds”中的最新插入行我想知道列ProjectName的内容,必须在表中插入完整的行,其名称为ProjectName 首先,我检查表的存在。 如果该表不存在(select返回0),我创建具有变量“qname”名称的表,并在其中插入完整的行。 如果表存在(select返回1),请使用变量“qname”的名称插入表中的行

以下代码会导致以下错误:
MySQL#1422存储函数或触发器

中不允许显式或实现提交
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 :(得分:1)

还有另一个问题有待发现。 qname是动态的,但您有INSERT INTO qname ...,它使用“qname”作为静态表名。明显的解决方案是CONCATPREPAREEXECUTE等。但是,我们不要这样做。

不要使用相同的架构创建大量表。这几乎总是一个糟糕的设计和维护噩梦,有时甚至是性能问题。

相反,在单个表中有一个额外的列用于将内容输入。并将qname放在该列中。该表的复合PRIMARY KEY的第一部分可能是qname

另一个问题......请勿通过SELECTMAX(id)发现列。相反,使用伪表OLD(还有NEW)。它更简单,更快捷。另外,它避免了MAX(id)可以从不同连接中获取id的竞争条件!

结论:花点时间研究TRIGGERs并查看示例。