snippetsqlModerate
Can't create table, but table doesn't exist
Viewed 0 times
cancreatebutexistdoesntable
Problem
I'm using these steps to create a table
Tried
Any ideas? Google has failed me so far. Thanks.
Extra info:
my_user, that already existed but somehow vanished from my database my_db:mysql> USE my_db;
mysql> DROP TABLE my_user;
mysql> ERROR 1051 (42S02): Unknown table 'my_user'
mysql> CREATE TABLE my_user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
mysql> ERROR 1005 (HY000): Can't create table 'my_db.my_user' (errno: -1)Tried
# mysqladmin flush-tables and repeated the steps above but it wasn't helpful. Also, restarted the mysql service, but no good.Any ideas? Google has failed me so far. Thanks.
Extra info:
mysql> SHOW engine innodb STATUS;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
140703 15:15:09 Error in foreign key constraint of table my_db/my_user
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "FK_CFBD431E285FAC6D" FOREIGN KEY ("group_id") REFERENCES "my_group" ("id")Solution
InnoDB Architecture
ANALYSIS
This sequence of events can be proved if you create the table using MyISAM. mysqld will allow it. Once you switch to InnoDB, it goes right back to the data dictionary, which is faulty on that one entry.
I have two suggestions
SUGGESTION #1
Don't create the table with that name anymore. Use a different table name
This will result in you changing the table name in your application code
SUGGESTION #2
I have dealt with this problem before in my post InnoDB table SELECT returns ERROR 2006 (HY000): MySQL server has gone away (after power outage)
ANALYSIS
- Somehow, you lost the
my_user.frmandmy_user.ibdfiles. The data dictionary still has an entry for that table.
- You cannot run
DROP TABLE my_user;because mysqld looks for themy_user.frmfirst. Since this is nomy_user.frm, the table cannot be dropped.
- Although
my_user.frmdoes not exist, you cannot runCREATE TABLE my_user ...because mysqld thinks it is OK to create the table but then defers to the storage engine. InnoDB says "I already have the tablespace_id of my_user registered".
This sequence of events can be proved if you create the table using MyISAM. mysqld will allow it. Once you switch to InnoDB, it goes right back to the data dictionary, which is faulty on that one entry.
I have two suggestions
SUGGESTION #1
Don't create the table with that name anymore. Use a different table name
CREATE TABLE my_usertable (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;This will result in you changing the table name in your application code
SUGGESTION #2
- mysqldump all the data, triggers and stored procedures
- backup ibdata1
- delete ibdata1
- reload the mysqldump
- Detailed steps from my StackOverflow post
I have dealt with this problem before in my post InnoDB table SELECT returns ERROR 2006 (HY000): MySQL server has gone away (after power outage)
Code Snippets
CREATE TABLE my_usertable (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;Context
StackExchange Database Administrators Q#69656, answer score: 12
Revisions (0)
No revisions yet.