使用触发器向表中添加MySQL列

使用触发器向表中添加MySQL列,mysql,variables,triggers,add,dynamic-columns,Mysql,Variables,Triggers,Add,Dynamic Columns,我有一张这样的桌子: 计数器: |客户id |提供者1 |提供者2 |提供者3| _——————————————————————_ 列名[provider1,provider2,…]是存储在另一个名为“providers”的表中的提供者id 我需要的是,当一个新的提供者插入到“Providers”数据库时,触发器会自动在“Counters”表中添加另一列,但我似乎无法获得它 这就是我到目前为止所做的: CREATE TRIGGER `providers_AFTER_INSERT` AFTER

我有一张这样的桌子:

计数器:

|客户id |提供者1 |提供者2 |提供者3|

_——————————————————————_

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

我需要的是,当一个新的提供者插入到“Providers”数据库时,触发器会自动在“Counters”表中添加另一列,但我似乎无法获得它


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

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;
但这显示了“添加”处的一个错误,表示这是意外的

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

另外,在搜索时,我也在一些帖子中说它不起作用,而一些人说它起作用,那些说它起作用的人不使用变量作为列名

如何修复此错误?这是否可行

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


谢谢你的建议

简短回答:不可能

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

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

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

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

Dynamic SQL is not allowed in stored function or trigger

mysql文档中有更多内容:

简短回答:不可能

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

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

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

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

Dynamic SQL is not allowed in stored function or trigger

mysql文档中的更多内容:

还有其他方法吗?可以使用存储过程吗?有办法绕过它吗?我需要一些东西。。我们可以使用SQL更改表,因此必须有一种解决方法?我确信我可以在我的脚本中执行此操作,该脚本将首先执行insert并执行另一个用于更改的查询,但我需要由DBMS而不是连接端(我的脚本)来处理,以避免使用新的.prov_id。只需尝试alter table add column。根本不要使用new关键字。也许works outColumn名称未知,这取决于定义要更新的列的插入是否有其他方法?可以使用存储过程吗?有办法绕过它吗?我需要一些东西。。我们可以使用SQL更改表,因此必须有一种解决方法?我确信我可以在我的脚本中执行此操作,该脚本将首先执行insert并执行另一个用于更改的查询,但我需要由DBMS而不是连接端(我的脚本)来处理,以避免使用新的.prov_id。只需尝试alter table add column。根本不要使用new关键字。可能是因为column name未知,这取决于定义哪些列将被更新的insert。我怀疑除了使用存储过程来执行所有插入,并让它准备动态查询(即使这样,我也不确定动态查询是否支持DDL语句)之外,还有什么办法。即使你找到了一种方法,我也会反对它;即使有这样的列也被认为是糟糕的数据库设计,更不用说自动化它们的创建了。我怀疑除了使用存储过程来执行所有插入操作,并让它准备动态查询(即使这样,我也不确定动态查询是否支持DDL语句)之外,还有什么其他方法。即使你找到了一种方法,我也会反对它;即使有这样的列也被认为是糟糕的数据库设计,更不用说自动创建它们了。