gpt4 book ai didi

mysql - 无法在 MySql 的触发器中引用具有计算虚拟列的表

转载 作者:行者123 更新时间:2023-11-29 20:55:35 25 4
gpt4 key购买 nike

这似乎是 MySql 中的一个错误。发在这里是为了证实我的结论并分享我的经验。我们目前正在从 MS SQL Server 迁移到 MySql Community Edition 5.7.12。有一个 Dealers 表,其中有一个虚拟计算列。它在触发器内使用的查询的连接中被引用。结果,MySql 服务器重新启动。

为了确保该事件没有其他原因,我们创建了一个没有计算列的虚拟表,并在触发器中引用该表。触发器执行成功。然后,我们使用计算列创建了另一个虚拟表。我们刚刚在联接中引用了表,而没有引用计算列。当触发器被触发时,尽管只引用了表的实际列并且没有引用计算列,但服务器还是崩溃了。因此,您甚至无法在触发器中引用包含计算列的表。

我们暂时做的就是将虚拟列转换为实际列,并修改表上的select、insert、update的查询。

有更好的替代方案来解决这个问题吗?

最佳答案

你能发布你的测试示例吗?我无法在我的测试示例中重现该问题。

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.12 |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `t2`;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `t1`;
Query OK, 0 rows affected (0.00 sec)

-- Table with Generated Column
mysql> CREATE TABLE IF NOT EXISTS `t1` (
-> `c0` INTEGER UNSIGNED NOT NULL PRIMARY KEY,
-> `value` VARCHAR(20),
-> `c1` INTEGER UNSIGNED GENERATED ALWAYS AS (`c0`) VIRTUAL
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `t2` (
-> `c1` INTEGER UNSIGNED NOT NULL PRIMARY KEY,
-> `value` VARCHAR(20)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `t2` (`c1`, `value`) VALUES (1, 'value 1');
Query OK, 1 row affected (0.00 sec)

mysql> DELIMITER ||

mysql> DROP TRIGGER IF EXISTS `t1_ins_bef`||
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TRIGGER `t1_ins_bef` BEFORE INSERT ON `t1`
-> FOR EACH ROW
-> BEGIN
-> SET NEW.`value` := (SELECT `t2`.`value`
-> FROM `t1`
-> INNER JOIN `t2` ON `t1`.`c1` = `t2`.`c1`);
-> END||
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> INSERT INTO `t1` (`c0`) VALUES (1), (2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT
-> `c0`,
-> `value`,
-> `c1`
-> FROM
-> `t1`;
+----+---------+------+
| c0 | value | c1 |
+----+---------+------+
| 1 | NULL | 1 |
| 2 | value 1 | 2 |
+----+---------+------+
2 rows in set (0.00 sec)

mysql> SELECT
-> `c1`,
-> `value`
-> FROM
-> `t2`;
+----+---------+
| c1 | value |
+----+---------+
| 1 | value 1 |
+----+---------+
1 row in set (0.00 sec)

关于mysql - 无法在 MySql 的触发器中引用具有计算虚拟列的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com