使用触发器将 MySQL 列添加到 table

adding MySQL column to a table using trigger

我有一个 table 看起来像这样:

计数器:

| client_id | 提供商 1 | 供应商2 | 提供商 3 |

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

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

我需要的是,当一个新的提供者被插入到 "proviers" 数据库时,触发器会自动在 "Counters" table 中添加另一列,但我似乎不能才能拿到。


这是我目前拥有的:

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

错误在 '.'在“新”之间;和 '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 如果需要,我可以升级它。

谢谢你的提前

简答:不可能。

ALTER TABLE 是所谓的 "DDL-statement"(数据定义语言),不同于 "DML-statements"(数据操作语言)。

触发器中不允许使用 DDL 语句,afaik。

您需要动态 SQL 才能执行此操作,因为 table 名称在 DDL 中是不可变的。

不幸的是,触发器中不允许动态 SQL。尝试在触发器中执行准备语句时,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