2016-06-06 12 views
0

이것은 MySql의 버그 인 것 같습니다. 내 결론을 확인하고 내 경험을 공유하기 위해 여기에 게시하십시오. 현재 MS SQL Server에서 MySql Community Edition 5.7.12으로 마이그레이션 중입니다. 가상 계산 열이있는 Dealers 테이블이 있습니다. 트리거 내에서 사용 된 쿼리 조인에서 참조되고있었습니다. 그 결과 MySql 서버가 다시 시작되었습니다.MySql 트리거에서 계산 된 가상 열이있는 테이블을 참조 할 수 없습니다.

이벤트에 대한 다른 원인이 없는지 확인하기 위해 계산 표가없는 더미 테이블 을 만들고 트리거의 해당 테이블을 참조했습니다. 트리거가 성공적으로 실행되었습니다. 그런 다음 계산 된 열이있는 다른 더미 테이블 을 생성했습니다. 계산 된 열을 참조하지 않고 조인에서 테이블을 방금 참조했습니다. 트리거가 실행되면 서버의 실제 열만 참조되고 계산 된 열에 대한 참조가 없다는 사실에 힘 입어 서버가 충돌했습니다. 따라서 트리거에서 계산 열이있는 테이블을 참조 할 수도 없습니다.

일시적으로 수행 한 작업은 가상 열을 실제 열로 변환하고 테이블에서 select, insert 및 update 쿼리를 수정하는 것입니다.

이 문제를 해결하기위한 더 좋은 방법이 있습니까?

답변

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)