无法在MySql

时间:2016-06-06 10:15:38

标签: mysql mysql-error-1064

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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)