mysql 触发器 动态sql_Mysql - 触发器中不允许使用动态SQL

本文介绍了尝试在MySQL触发器中使用动态SQL时遇到的问题。作者创建了一个触发器,旨在当`attribute_values`表有新插入时,更新`product_attributes`表的相关列。然而,执行插入操作时遇到了错误,提示触发器中不允许使用DDL和DML语句。文章询问是否在MySQL中有解决此问题的方法。
摘要由CSDN通过智能技术生成

我想用动态SQL创建一个触发器,我从变量中获取一个列名 . 这是我简化的mysql架构:

CREATE TABLE products (id int);

INSERT INTO products VALUES (1),(2);

CREATE TABLE attribute_values

(product_id int, `key` varchar(100), value varchar(100));

INSERT INTO attribute_values VALUES

( 1, 'title', 'Orange'),

( 1, 'code', 'O125'),

( 2, 'title', 'Pizza');

CREATE TABLE product_attributes

SELECT products.id,

MAX(CASE WHEN attribute_values.key = 'title' THEN attribute_values.value END) title,

MAX(CASE WHEN attribute_values.key = 'code' THEN attribute_values.value END) code

FROM products JOIN attribute_values ON products.id = attribute_values.product_id

GROUP BY products.id;

# trigger

DELIMITER //

CREATE PROCEDURE attribute_values_after_insert(IN product_id INT, IN column_name VARCHAR(100), IN val VARCHAR(100))

BEGIN

SET @sql = NULL;

SELECT concat('UPDATE product_attributes SET product_attributes.', column_name, '=', val, ' WHERE id=', product_id) INTO @sql;

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET @sql = NULL;

END//

DELIMITER ;

DELIMITER //

CREATE TRIGGER attribute_values_insert_trigger AFTER INSERT ON attribute_values FOR EACH ROW

BEGIN

CALL attribute_values_after_insert(NEW.product_id, NEW.key, NEW.value);

END

DELIMITER ;

即:

餐桌产品:

+-------------+

| id |

+-------------+

| 1 |

| 2 |

+-------------+

table attribute_values:

+-------------+----------+-----------+

| product_id | key | value |

+-------------+----------+-----------+

| 1 | title | Orange |

| 1 | code | O125 |

| 2 | title | Pizza |

+-------------+----------+-----------+

table product_attributes:

+-------------+----------+-----------+

| id | title | code |

+-------------+----------+-----------+

| 1 | Orange | 0125 |

| 2 | Pizza | |

+-------------+----------+-----------+

在触发器中,我想在插入表attribute_values后更新表product_attributes .

当我执行查询时:

INSERT INTO attribute_values VALUES (2, 'code', '0126');

我收到错误:

MySQL的查询面板中不允许使用DDL和DML语句;只允许SELECT语句 . 将DDL和DML放在架构面板中 .

在mysql中有这个解决方案吗?

谢谢你的努力:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值