我有一个看起来像这样的表:
计数器:
| 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 如有必要,我可以升级它。
先谢谢你
答案 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