我尝试将集合表中的副本行自动化为专用表。 有时专用表不存在,因此我检查是否存在,如果需要,我在复制该行之前创建表。 此代码包含在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
任何人都可以使用这段代码吗?
创建一个表涉及一个隐式提交...你不能从触发器创建一个表 –
你的第一句话是显示实际的问题 - 在SQL中,你不检查表是否存在 - 你认为它确实存在。如果它不存在,则会通过从数据库中创建表获得一个您不能从中恢复的错误。我明白,尽量避免麻烦,但动态创建表格不是答案。它不可维护,它包含魔法,它可能是调试的噩梦。如果你简单地假设表格存在,你的问题就会消失。如果没有 - 你的系统需要某种迁移脚本,它将在第一次运行时创建表格。 – Mjh