2016-06-06 8 views
0

Dies scheint ein Fehler in MySql zu sein. Posting es hier, um meine Schlussfolgerung zu bestätigen und meine Erfahrung zu teilen. Wir migrieren derzeit von MS SQL Server zu MySql Community Edition 5.7.12. Es gibt eine Tabelle, die eine virtuelle berechnete Spalte hat. Es wurde in der Verknüpfung einer Abfrage innerhalb eines Triggers verwiesen. Als Folge davon wurde der MySql Server neu gestartet.Kann nicht auf Tabellen mit berechneten virtuellen Spalten in Auslösern von MySql verweisen

Um sicherzustellen, dass es keine andere Ursache für das Ereignis gab, hatten wir eine Dummy-Tabelle ohne berechnete Spalten erstellt und auf diese Tabelle im Trigger verwiesen. Der Trigger wurde erfolgreich ausgeführt. Dann hatten wir eine weitere Dummy-Tabelle mit der berechneten Spalte erstellt. Wir hatten gerade die Tabelle in der Verknüpfung ohne den Verweis auf die berechnete Spalte verwiesen. Wenn der Trigger ausgelöst wurde, stürzte der Server ab, obwohl nur eine tatsächliche Spalte der Tabelle referenziert wurde und kein Verweis auf die berechnete Spalte vorhanden war. Daher können Sie in den Triggern nicht einmal eine Tabelle mit berechneten Spalten referenzieren.

Wir haben die virtuellen Spalten in tatsächliche Spalten konvertiert und die Abfragen von Select, Insert und Update auf der Tabelle geändert.

Gibt es eine bessere Alternative, um dieses Problem zu lösen?

Antwort

0

Können Sie Ihr Testbeispiel veröffentlichen ?. Ich kann das Problem in meinem Testbeispiel nicht reproduzieren.

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)