使用触发器将 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
我有一个 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