首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用触发器将MySQL列添加到表中

问使用触发器将MySQL列添加到表中
EN

Stack Overflow用户
提问于 2017-02-24 23:55:16
回答 1查看 1.8K关注 0票数 0

我有张桌子看起来像这样:

计数器:

client_id,provider1,provider2,provider3,provider3

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

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

到目前为止,这就是我所拥有的:

代码语言:javascript
复制
CREATE TRIGGER `providers_AFTER_INSERT` AFTER INSERT ON `providers` FOR EACH ROW
    ALTER TABLE `counters` ADD NEW.prov_id int;

错误在“.”处。在“NEW;”和“prov_id”之间的错误:

代码语言:javascript
复制
Syntax error: unexpected '.' (dot)

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

代码语言:javascript
复制
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;

但这显示我在“添加”中出现了一个错误,表示这是意外的。

还尝试用括号{NEW.prov_id}包围变量,但没有结果,它在'ADD‘子句中给出了相同的错误。

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

如何纠正此错误?这是可行的吗?

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

谢谢您的光临

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-24 23:59:05

简短的回答:不可能。

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

DDL-在触发器中不允许语句,afaik。

要做到这一点,需要动态SQL,因为DDL中的表名不是变量。

不幸的是,触发器中不允许动态SQL。当试图在触发器中执行准备语句时,mysql会抛出一个错误:

代码语言:javascript
复制
Dynamic SQL is not allowed in stored function or trigger

在mysql文档中有更多信息:https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42450231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档