【发布时间】:2014-02-22 12:30:09
【问题描述】:
我尝试使用下面的 CREATE TABLE 语句在 MySQL 中创建一个表:
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;
我收到了这个错误:
错误 1005 (HY000): 无法创建表 'fooschema.visit' (errno: 121)
我使用了 SHOW ENGINE INNODB STATUS 命令。这是错误信息:
---------------------- 最新的外键错误 ---------------------- 140222 7:03:17 为表`fooschema`.`visit` 创建外键约束时出错。 名称为“fooschema/FK_visit_site”的外键约束 已经存在。 (请注意,InnoDB 内部添加了 'databasename/' 在用户定义的约束名称前面)。 注意 InnoDB 的 FOREIGN KEY 系统表存储 约束名称不区分大小写,使用 MySQL 标准 latin1_swedish_ci 排序规则。如果你 创建名称不同的表或数据库 字符大小写,然后是约束碰撞 名称可以出现。解决方法:命名您的约束 明确地使用唯一的名称。然后,我使用下面的查询列出了所有可用的约束:
select *
from information_schema.table_constraints
where constraint_schema = 'fooschema'
我在结果中没有看到名称为“FK_visit_site”的任何约束。
FK_visit_site 约束是表访问的外键约束。我删除了访问表并尝试重新创建它。
有没有一种方法可以删除这个外键约束,即使它关联的表不存在?
【问题讨论】:
-
你可以给你的新密钥一个不同的名字吗?
-
是的,我可以。但我真的很想使用旧名称。使用旧名称很重要。
-
select * from information_schema.table_constraints where constraint_name = 'FK_visit_site'返回什么` -
这个名字太糟糕了。我希望外键必须在某个地方。..
-
select * from information_schema.table_constraints where constraint_name = 'FK_visit_site' 返回空集。
标签: mysql sql constraints