Description:
NDB incorrectly allows ALTER TABLE... ENGINE on a table which has or references foreign key constraints. This ALTER to another engine is blocked under InnoDB
How to repeat:
mysql> create table t1 (a int unsigned auto_increment primary key, b varchar(20)) engine=ndbcluster;
Query OK, 0 rows affected (0.32 sec)
mysql> create table t2 (a int unsigned auto_increment primary key, t1a int unsigned, b varchar(20), foreign key `fk1` (t1a) references t1 (a) on delete cascade) engine=ndbcluster;
Query OK, 0 rows affected (0.46 sec)
mysql> insert into t1 (b) values('mysql'); insert into t2 (t1a,b) values(last_insert_id(),'cluster');
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.01 sec)
mysql> delete from t1 where a = 1 ;
Query OK, 1 row affected (0.01 sec)
mysql> select * from t2;
Empty set (0.00 sec)
mysql> insert into t1 (b) values('mysql'); insert into t2 (t1a,b) values(last_insert_id(),'cluster');
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.02 sec)
mysql> select * from t1 ; select * from t2;
+---+-------+
| a | b |
+---+-------+
| 2 | mysql |
+---+-------+
1 row in set (0.01 sec)
+---+------+---------+
| a | t1a | b |
+---+------+---------+
| 2 | 2 | cluster |
+---+------+---------+
1 row in set (0.00 sec)
mysql> alter table t1 engine=innodb;
Query OK, 1 row affected (0.50 sec)
Records: 1 Duplicates: 0 Warnings: 0
/** NO ERROR **/
mysql> delete from t1 where a = 2;
Query OK, 1 row affected (0.03 sec)
mysql> select * from t1;
Empty set (0.00 sec)
mysql> select * from t2;
+---+------+---------+
| a | t1a | b |
+---+------+---------+
| 2 | 2 | cluster |
+---+------+---------+
1 row in set (0.00 sec)
/** ORPHANED ROW **/
Suggested fix:
Perform same checks for NDB tables as InnoDB.
mysql> create table t1 (a int unsigned auto_increment primary key, b varchar(20)) engine=innodb;
Query OK, 0 rows affected (0.08 sec)
mysql> create table t2 (a int unsigned auto_increment primary key, t1a int unsigned, b varchar(20), foreign key `fk1` (t1a) references t1 (a) on delete cascade) engine=innodb;
Query OK, 0 rows affected (0.17 sec)
mysql> alter table t1 engine=myisam;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Description: NDB incorrectly allows ALTER TABLE... ENGINE on a table which has or references foreign key constraints. This ALTER to another engine is blocked under InnoDB How to repeat: mysql> create table t1 (a int unsigned auto_increment primary key, b varchar(20)) engine=ndbcluster; Query OK, 0 rows affected (0.32 sec) mysql> create table t2 (a int unsigned auto_increment primary key, t1a int unsigned, b varchar(20), foreign key `fk1` (t1a) references t1 (a) on delete cascade) engine=ndbcluster; Query OK, 0 rows affected (0.46 sec) mysql> insert into t1 (b) values('mysql'); insert into t2 (t1a,b) values(last_insert_id(),'cluster'); Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) mysql> delete from t1 where a = 1 ; Query OK, 1 row affected (0.01 sec) mysql> select * from t2; Empty set (0.00 sec) mysql> insert into t1 (b) values('mysql'); insert into t2 (t1a,b) values(last_insert_id(),'cluster'); Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.02 sec) mysql> select * from t1 ; select * from t2; +---+-------+ | a | b | +---+-------+ | 2 | mysql | +---+-------+ 1 row in set (0.01 sec) +---+------+---------+ | a | t1a | b | +---+------+---------+ | 2 | 2 | cluster | +---+------+---------+ 1 row in set (0.00 sec) mysql> alter table t1 engine=innodb; Query OK, 1 row affected (0.50 sec) Records: 1 Duplicates: 0 Warnings: 0 /** NO ERROR **/ mysql> delete from t1 where a = 2; Query OK, 1 row affected (0.03 sec) mysql> select * from t1; Empty set (0.00 sec) mysql> select * from t2; +---+------+---------+ | a | t1a | b | +---+------+---------+ | 2 | 2 | cluster | +---+------+---------+ 1 row in set (0.00 sec) /** ORPHANED ROW **/ Suggested fix: Perform same checks for NDB tables as InnoDB. mysql> create table t1 (a int unsigned auto_increment primary key, b varchar(20)) engine=innodb; Query OK, 0 rows affected (0.08 sec) mysql> create table t2 (a int unsigned auto_increment primary key, t1a int unsigned, b varchar(20), foreign key `fk1` (t1a) references t1 (a) on delete cascade) engine=innodb; Query OK, 0 rows affected (0.17 sec) mysql> alter table t1 engine=myisam; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails