| Bug #60229 | Broken compatibility: Error while create table with foreign key constraints. | ||
|---|---|---|---|
| Submitted: | 24 Feb 2011 7:17 | Modified: | 26 Aug 2013 6:31 |
| Reporter: | Abhilesh Khatri | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: DDL | Severity: | S2 (Serious) |
| Version: | 5.5.9, 5.5.11 | OS: | Any (32 bit as well as 64-bit MySQL installer on Windows) |
| Assigned to: | CPU Architecture: | Any | |
[24 Feb 2011 7:17]
Abhilesh Khatri
[24 Feb 2011 9:12]
Abhilesh Khatri
Sample Sql file to reproduce the issue
Attachment: Simulation.sql (application/octet-stream, text), 944 bytes.
[24 Feb 2011 13:16]
MySQL Verification Team
Thank you for the bug report.
C:\DBS>c:\dbs\5.5\bin\mysql -uroot --port=3540 --prompt="mysql 5.5 >"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.11 Source distribution
Copyright (c) 2000, 2010, 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.5 >use test
Database changed
mysql 5.5 >show variables like '%lower_case_table_names%'
-> ;
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql 5.5 >DROP TABLE IF EXISTS PHOTO;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql 5.5 >DROP TABLE IF EXISTS ADDRESS;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.5 >DROP TABLE IF EXISTS PERSON;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.5 >
mysql 5.5 >CREATE TABLE PERSON (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> NAME NVARCHAR(255) NOT NULL,
-> CONSTRAINT PK_PERSON PRIMARY KEY (PERSON_ID, DOB)
-> )Engine=InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql 5.5 >
mysql 5.5 >CREATE TABLE PHOTO (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> PHOTO_DETAILS VARCHAR(50) NULL,
-> CONSTRAINT PK_PHOTO PRIMARY KEY (PERSON_ID, DOB),
-> CONSTRAINT FK_PHOTO_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON (PERSON_ID,
-> DOB)
-> )Engine=InnoDB;
ERROR 1005 (HY000): Can't create table 'test.PHOTO' (errno: 150)
mysql 5.5 >
mysql 5.5 >CREATE TABLE ADDRESS (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> ADDRESS_ID VARCHAR(50) NOT NULL,
-> ADDRESS_DETAILS NVARCHAR(250) NULL,
-> CONSTRAINT PK_ADDRESS PRIMARY KEY (PERSON_ID, DOB, ADDRESS_ID),
-> CONSTRAINT FK_ADDRESS_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON
-> (PERSON_ID, DOB) ON DELETE CASCADE
-> )Engine=InnoDB;
ERROR 1005 (HY000): Can't create table 'test.ADDRESS' (errno: 150)
mysql 5.5 >exit
Bye
C:\DBS>55
C:\DBS>c:\dbs\5.5\bin\mysql -uroot --port=3540 --prompt="mysql 5.5 >"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.11 Source distribution
Copyright (c) 2000, 2010, 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.5 >use test
Database changed
mysql 5.5 >DROP TABLE IF EXISTS PHOTO;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.5 >DROP TABLE IF EXISTS ADDRESS;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.5 >DROP TABLE IF EXISTS PERSON;
Query OK, 0 rows affected (0.12 sec)
mysql 5.5 >
mysql 5.5 >CREATE TABLE PERSON (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> NAME NVARCHAR(255) NOT NULL,
-> CONSTRAINT PK_PERSON PRIMARY KEY (PERSON_ID, DOB)
-> )Engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)
mysql 5.5 >
mysql 5.5 >CREATE TABLE PHOTO (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> PHOTO_DETAILS VARCHAR(50) NULL,
-> CONSTRAINT PK_PHOTO PRIMARY KEY (PERSON_ID, DOB),
-> CONSTRAINT FK_PHOTO_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON (PERSON_ID,
-> DOB)
-> )Engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)
mysql 5.5 >
mysql 5.5 >CREATE TABLE ADDRESS (
-> PERSON_ID VARCHAR(50) NOT NULL,
-> DOB VARCHAR(50) NOT NULL,
-> ADDRESS_ID VARCHAR(50) NOT NULL,
-> ADDRESS_DETAILS NVARCHAR(250) NULL,
-> CONSTRAINT PK_ADDRESS PRIMARY KEY (PERSON_ID, DOB, ADDRESS_ID),
-> CONSTRAINT FK_ADDRESS_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON
-> (PERSON_ID, DOB) ON DELETE CASCADE
-> )Engine=InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql 5.5 >show variables like '%lower_case_table_names%'
-> ;
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql 5.5 >
[11 Mar 2011 11:59]
Martin Keckeis
I got the same problem. On my development machine, i got: 5.5.8 and i wanted to install 5.5.9. on a server 5.5.8 -> working 5.5.0 -> foreign keys broken My setting: lower_case_table_names = 0
[28 Mar 2011 8:21]
Abhilesh Khatri
I believe that we all agree with this as a defect (since the status -> verified). May I know which MySQL release is expected to have this fix?
[2 May 2011 9:51]
Abhilesh Khatri
This is a very fundamental issue. Since last 2 months no progress is visible. Therefore, increasing defect severity. My kind request is that at least let us know which MySQL release will this issue be fixed?
[2 May 2011 12:13]
Abhilesh Khatri
I get the same issue regardless of where we define the PK-FK relationships i.e. either in the table definition itself or as a separate alter statement as shown below.
ALTER TABLE PHOTO ADD CONSTRAINT FK_PHOTO_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON (PERSON_ID, DOB);
ALTER TABLE ADDRESS ADD CONSTRAINT FK_ADDRESS_2_PERSON FOREIGN KEY (PERSON_ID, DOB) REFERENCES PERSON (PERSON_ID, DOB) ON DELETE CASCADE;
Important thing to notice here is that variable lower_case_table_names=0.
Is there any workaround available for this issue?
[2 May 2011 12:15]
Abhilesh Khatri
I get below error when PK-FK is set using ALTER statement. Error Code : 1005 Can't create table 'test.#sql-115c_2' (errno: 150) Execution Time : 00:00:00:000 Transfer Time : 00:00:00:000 Total Time : 00:00:00:000
[9 May 2011 6:06]
Abhilesh Khatri
Updated the OS section. The issue occurs only on Windows environment. On Linux, despite of lower_case_table_names being 0 (which is the default value), issue doesn't crop up. So, issue needs to be addressed for Windows environment alone.
[8 Dec 2011 8:25]
Peter Laursen
Was this report closed by mistake?
[8 Dec 2011 10:17]
Abhilesh Khatri
Please justify why this ticket was closed? Re-opened it again.
[12 Dec 2011 20:36]
Benjamin Morel
I have a similar problem with MySQL 5.6.3 on Windows XP. Any query involving a constrained table fails with a 150 error right after importing a SQL dump from a Linux server, involving CamelCased table names. Same job on another linux machine works fine. This is a blocking issue.
[13 Dec 2011 9:21]
Benjamin Morel
Confirmed the bug with the attachment above (Simulation.sql) under MySQL 5.6.3 Note that these tables under information_schema report the wrong name for the tables (test/person instead of test/PERSON): INNODB_BUFFER_PAGE INNODB_SYS_TABLESTATS INNODB_BUFFER_PAGE_LRU INNODB_SYS_TABLES
[8 Feb 2012 18:05]
John Russell
Added to changelog for 5.5.20, 5.6.5: Certain CREATE TABLE statements could fail for InnoDB child tables containing foreign key definitions. This problem affected Windows systems only, with the setting lower_case_table_names=0. It was a regression from MySQL bug #55222.
[26 Aug 2013 6:31]
Abhilesh Khatri
Well, I verified this on MySQL 5.6.13. Indeed, it works. However, now I see another issue i.e. the tables were stored with lower case names :-(. See below. mysql> use test; mysql> SELECT @@lower_case_table_names; '@@lower_case_table_names' =========================== '1' mysql> show tables; 'Tables_in_test' =================== 'address' ------------> Stored in lower case. 'person' 'photo' I tried to switch the value of lower_case_table_names to '0'. However, despite of modifying C:\Program Files\MySQL\MySQL Server 5.6\my-default.ini with this property and restarting database service, it is still NOT reflecting. Workaround There is one (although NOT so elegant) workaround. When dealing with 'mysql-connector-java-5.0.8-bin.jar', fortunately tables are ALWAYS stored in upper case. That still renders the query response with table name returned in UPPER case. Is there a better solution already available?
