我尝试将副本行从集合表自动化到专用表。 有时专用表不存在,因此我检查是否存在,如果需要,我在复制行之前创建表。 此代码包含在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
任何人都可以帮我这个代码吗?
答案 0 :(得分:1)
还有另一个问题有待发现。 qname
是动态的,但您有INSERT INTO qname ...
,它使用“qname”作为静态表名。明显的解决方案是CONCAT
,PREPARE
,EXECUTE
等。但是,我们不要这样做。
不要使用相同的架构创建大量表。这几乎总是一个糟糕的设计和维护噩梦,有时甚至是性能问题。
相反,在单个表中有一个额外的列用于将内容输入。并将qname
放在该列中。该表的复合PRIMARY KEY
的第一部分可能是qname
。
另一个问题......请勿通过SELECT
和MAX(id)
发现列。相反,使用伪表OLD
(还有NEW
)。它更简单,更快捷。另外,它避免了MAX(id)
可以从不同连接中获取id的竞争条件!
结论:花点时间研究TRIGGERs
并查看示例。