2017-01-09 171 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阅读该页面的其余部分。 –

相关问题