使用触发器

时间:2017-02-24 23:55:16

标签: mysql variables triggers add dynamic-columns

我有一个看起来像这样的表:

计数器:

| client_id | provider1 | provider2 | provider3 |

_ - _ - _- _ - _ - _- _ - _ - _

列名[provider1,provider2,...]是提供者的ID,存储在名为" providers"的另一个表中。

我需要的是,当一个新的提供者被插入" proviers"数据库触发器会自动在"计数器"中添加另一列。桌子,但我似乎无法得到它。

这是我到目前为止所做的:

CREATE TRIGGER `providers_AFTER_INSERT` AFTER INSERT ON `providers` FOR EACH ROW
    ALTER TABLE `counters` ADD NEW.prov_id int;

错误发生在'。'在' NEW之间;和' prov_id'错误:

Syntax error: unexpected '.' (dot)

我猜它需要一个字符串值作为列的名称,所以我搜索了一下并找到了将其作为字符串传递的方法:

CREATE TRIGGER `providers_AFTER_INSERT` AFTER INSERT ON `providers` FOR EACH ROW
    ALTER TABLE `counters` ADD CAST(NEW.prov_id AS CHAR CHARACTER SET utf8) int;

但这显示我在“ADD'说这是出乎意料的。

还尝试用括号{NEW.prov_id}包围变量但是无济于事,它在“ADD”中给出了同样的错误。子句。

另外,在搜索时我也会在某些帖子中说它不起作用,而有些人说它确实有效,而那些说它有用的人不会使用变量作为列名。

我该如何修复此错误?它甚至可行吗?

我的MySQL是v5.0 如有必要,我可以升级它。

先谢谢你

1 个答案:

答案 0 :(得分:1)

简短回答:不可能。

ALTER TABLE是一种所谓的“DDL语句”(数据定义语言),它与“DML语句”(数据操作语言)不同。

在触发器中不允许DDL声明,afaik。

您需要动态SQL来执行此操作,因为表名在DDL中不可变。

不幸的是,触发器中不允许使用动态SQL。当尝试在触发器中执行prepare语句时,mysql会抛出错误:

Dynamic SQL is not allowed in stored function or trigger

mysql文档中的更多内容:https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html