简体   繁体   中英

MySQL: Can't create table

I tried to create a table in MySQL using the CREATE TABLE statement below:

CREATE TABLE `visit` (
  `visit_id` int(11) NOT NULL,
  `site_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`visit_id`),
  CONSTRAINT `FK_visit_site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

I received this error:

ERROR 1005 (HY000): Can't create table 'fooschema.visit' (errno: 121)

I used SHOW ENGINE INNODB STATUS command. This is the error message:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
140222  7:03:17 Error in foreign key constraint creation for table `fooschema`.`visit`.
A foreign key constraint of name `fooschema/FK_visit_site`
already exists. (Note that internally InnoDB adds 'databasename/'
in front of the user-defined constraint name).
Note that InnoDB's FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.

Then, I used the query below to list all available constraints:

select *
from information_schema.table_constraints
where constraint_schema = 'fooschema'

I didn't see any constraint with name 'FK_visit_site' in the result.

The FK_visit_site constraint was a foreign key constraint of table visit. I dropped the visit table and attempted to recreate it.

Is there a way I can drop this foreign key constraint even when the table it was associated to doesn't exist?

your foreign key already exist , so either drop existed foreign key or rename your second key.

 ALTER TABLE `site` DROP FOREIGN KEY `FK_visit_site`;

or rename to other new one.

CREATE TABLE `visit` (
 `visit_id` int(11) NOT NULL PRIMARY KEY,
 `site_id` int(11) NOT NULL,
CONSTRAINT `FK_visit_site` FOREIGN KEY (`site_id`) REFERENCES `site` (`site_id`),
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Added PRIMARY KEY to the visit_id line.

Note:

make sure that site_id in the site table have exact same datatype of site_id in visit table.

like that

  `site_id` int(11) DEFAULT NULL  --//in the `site` table 

The two keys you're coupling must have the exact same datatype ( INT NOT NULL), even signedness

AFAIK, you will get this error when you're trying to add a constraint with a name that's already used somewhere else. Means, in your case FK FK_visit_site had already been used before.

If the table you're trying to create includes a foreign key constraint, and you've provided your own name for that constraint, remember that it must be unique within the database.

You can run the below query to find out the same

SELECT
  constraint_name,
  table_name
FROM
  information_schema.table_constraints
WHERE
  constraint_type = 'FOREIGN KEY'
  AND table_schema = DATABASE()
ORDER BY
  constraint_name;

Taken from the post here http://www.thenoyes.com/littlenoise/?p=81

Try using a different name for your FK like

CREATE TABLE `visit` (
  `visit_id` int(11) NOT NULL,
  `site_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`visit_id`),
  CONSTRAINT `FK_visit_site_New` FOREIGN KEY (`site_id`) 
  REFERENCES `site` (`site_id`),
) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM