2016-06-06 4 views
0

Это, кажется, ошибка в MySql. Проводя его здесь, чтобы подтвердить мой вывод и поделиться своим опытом. В настоящее время мы переносимся с MS SQL Server на MySql Community Edition 5.7.12. Существует таблица Dealers, которая имеет виртуальный вычисляемый столбец. Он упоминался в объединении запроса, используемого внутри триггера. В результате этого сервер MySql снова запущен.Невозможно ссылаться на таблицы с вычисленными виртуальными столбцами в триггерах MySql

Чтобы убедиться, что не было другой причины для события, мы создали таблицу фиктивных данных без вычисленных столбцов и ссылались на эту таблицу в триггере. Триггер выполнен успешно. Затем мы создали еще один фиктивный стол с вычисленным столбцом. Мы только что указали таблицу в объединении без ссылки на вычисленный столбец. Когда триггер был запущен, сервер потерпел крах из-за того, что был передан только фактический столбец таблицы и ссылки на вычисленный столбец не было. Таким образом, вы даже не можете ссылаться на таблицу с вычисленными столбцами в триггерах.

Временное решение состоит в том, чтобы преобразовать виртуальные столбцы в фактические столбцы и изменить запросы на выбор, вставку и обновление в таблице.

Есть ли лучшая альтернатива для решения этой проблемы?

ответ

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)