| Bug #79918 | Cannot add foreign key constraint | ||
|---|---|---|---|
| Submitted: | 11 Jan 2016 16:52 | Modified: | 18 Apr 2019 16:25 |
| Reporter: | Stefano Giacone | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S1 (Critical) |
| Version: | 5.7.10 | OS: | Any (Win7 and Ubuntu) |
| Assigned to: | CPU Architecture: | Any | |
[11 Jan 2016 16:52]
Stefano Giacone
[11 Jan 2016 20:19]
MySQL Verification Team
C:\dbs>c:\dbs\5.7\bin\mysql -uroot -p --port=3570 --prompt="mysql 5.7 > "
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.11 Source distribution PULL: 2015-DEC-27
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql 5.7 > use test
Database changed
mysql 5.7 > set @@foreign_key_checks=0;
Query OK, 0 rows affected (0.03 sec)
mysql 5.7 >
mysql 5.7 > create table first_table(
-> id int(11) unsigned NOT NULL AUTO_INCREMENT,
-> field1 int(11) unsigned,
-> field2 int(11) GENERATED ALWAYS AS (field1+1) virtual,
-> test varchar(50),
-> PRIMARY KEY (id),
-> key test (test),
-> key test2 (test,field2) USING BTREE,
-> FOREIGN KEY (`test`) REFERENCES second_table (`test`) ON DELETE cascade ON UPDATE CASCADE
-> );
ERROR 1215 (HY000): Cannot add foreign key constraint
mysql 5.7 >
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.9 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set @@foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> create table first_table(
-> id int(11) unsigned NOT NULL AUTO_INCREMENT,
-> field1 int(11) unsigned,
-> field2 int(11) GENERATED ALWAYS AS (field1+1) virtual,
-> test varchar(50),
-> PRIMARY KEY (id),
-> key test (test),
-> key test2 (test,field2) USING BTREE,
-> FOREIGN KEY (`test`) REFERENCES second_table (`test`) ON DELETE cascade ON UPDATE CASCADE
-> );
Query OK, 0 rows affected (0.06 sec)
mysql>
[11 Jan 2016 20:37]
MySQL Verification Team
Please check: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-10.html "InnoDB: A secondary index is not permitted on a virtual column that is based on a foreign key-referenced column that uses ON DELETE CASCADE, ON DELETE SET NULL, ON UPDATE CASCADE, or ON UPDATE SET NULL. The restriction was not enforced. (Bug #21508402)" Thanks.
[12 Jan 2016 8:51]
Stefano Giacone
Thanks very much for your feedback, maybe I misunderstood the documentation: in the example provided, as you can see, there are 2 indexes: I believe the foreign key should use the index "test" and not the index "test2" that is the "faulty" secondary index. From the documentation "A secondary index on a virtual column cannot be used as the index for a foreign key.": what I'm saying is that I'm not using that secondary index as the index for the foreign key. "Secondary indexes are not supported on virtual columns that have a base column that is referenced in a foreign key constraint": the foreign key constraint in the example should not use the "faulty" secondary index. Maybe we're saying you can't tell mysql which index to use for a foreign key constraint? Not sure if: - I'm misunderstanding the documentation (could be, sorry for that!!) - The documentation can be more clear on it - It's an actual bug (maybe it was enforced in a slightly wrong way) Let me know your thoughts on it, thanks again.
[27 Jan 2016 8:40]
MySQL Verification Team
Thank you for the feedback.
[14 Jun 2017 13:04]
Anjan T
I am on MacOS Sierra 10.12.5 . I have installed MySQL 5.7.18 through HomeBrew. I am facing an issue which is very similar to what is described by the OP. The following does NOT work. When creating the "reports" table, it throws an error: Kernel error: Error( 1215 ) HY000: "Cannot add foreign key constraint" ================================= CREATE TABLE `templates` ( `id` varbinary(16) NOT NULL PRIMARY KEY, `uuid` varchar(36) AS (insert( insert( insert( insert( hex(id),9,0,'-' ), 14,0,'-' ), 19,0,'-' ), 24,0,'-' )), `name` varchar(255) NOT NULL, UNIQUE INDEX `index_templates_on_uuid` (`uuid`) ) ENGINE=InnoDB CREATE TABLE `reports` ( `id` varbinary(16) NOT NULL PRIMARY KEY, `uuid` varchar(36) AS (insert( insert( insert( insert( hex(id),9,0,'-' ), 14,0,'-' ), 19,0,'-' ), 24,0,'-' )), `template_id` varbinary(16) NOT NULL, `css` text, UNIQUE INDEX `index_reports_on_uuid` (`uuid`), INDEX `index_reports_on_template_id` (`template_id`), CONSTRAINT `fk_rails_71741adcd8` FOREIGN KEY (`template_id`) REFERENCES `templates` (`id`) ) ENGINE=InnoDB ================================ Note the columns order in the "reports" table is: * id * uuid (virtual column) * template_id (foreign key) * css If I just make a small change to the "CREATE TABLE" of the "reports" table, it works. ================================ CREATE TABLE `reports` ( `id` varbinary(16) NOT NULL PRIMARY KEY, `uuid` varchar(36) AS (insert( insert( insert( insert( hex(id),9,0,'-' ), 14,0,'-' ), 19,0,'-' ), 24,0,'-' )), `css` text, `template_id` varbinary(16) NOT NULL, UNIQUE INDEX `index_reports_on_uuid` (`uuid`), INDEX `index_reports_on_template_id` (`template_id`), CONSTRAINT `fk_rails_71741adcd8` FOREIGN KEY (`template_id`) REFERENCES `templates` (`id`) ) ENGINE=InnoDB ================================ Note: the change I made is to just place the "css" column between the "uuid" and "template_id" columns. So, the new order of columns is: * id * uuid (virtual column) * css * template_id (foreign key) Just re-ordering the columns makes it work! The pattern I have noticed is: If the foreign key column is immediately after a virtual column, this error is thrown. If there is a non-foreign-key column in between, it works. Or, if the virtual column is placed at the end, it works. This has to be a bug, right?
[18 Apr 2019 16:25]
Dmitry Lenev
Posted by developer: Hello! This issue is addressed by the same patch as bug #22469130 / bug#79772 "FOREIGN KEY ON DELETE CASCADE NOT ALLOWED WHEN A VIRTUAL INDEX EXISTS". So I am marking this report as a duplicate of the latter bug report.
