【问题标题】:MySQL: Can't create tableMySQL:无法创建表
【发布时间】: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


【解决方案1】:

你的外键已经存在,所以要么删除现有的外键,要么重命名你的第二个键。

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

或重命名为其他新名称。

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;

PRIMARY KEY 添加到visit_id 行。

注意:

确保site 表中的site_id 与访问表中的site_id 具有完全相同的数据类型。

这样

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

您要耦合的两个键必须具有完全相同的数据类型(INT NOT NULL),甚至是签名

【讨论】:

  • 在我的情况下,明确的约束名称很重要,因为我以后可能需要以编程方式删除它。
  • 尝试了修改后的版本。这里是站点表: CREATE TABLE site (site_id int(11) NOT NULL, location_id int(11) DEFAULT NULL, site_name varchar(50) DEFAULT NULL, PRIMARY KEY (site_id), CONSTRAINT @ 987654334@ FOREIGN KEY (location_id) 参考 location (location_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 尝试删除FK_visit_site,然后在您的表中重新创建它,以确保它是否存在。
  • 老兄,您的 site_id 数据类型在两个表中都不相同。我已经编辑了我的答案创建表。试试吧
  • 我试过了。以下是错误消息:ERROR 1146 (42S02): Table 'fooschema.visit' doesn't exist
【解决方案2】:

AFAIK,当您尝试添加名称已在其他地方使用的约束时,您将收到此错误。意味着,在您的情况下,FK FK_visit_site 之前已经使用过。

如果您尝试创建的表包含外键约束,并且您为该约束提供了自己的名称,请记住它在数据库中必须是唯一的。

您可以运行以下查询以找出相同的结果

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

取自这里的帖子 http://www.thenoyes.com/littlenoise/?p=81

尝试为您的 FK 使用不同的名称,例如

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`),
) 

【讨论】:

  • 约束名称不在您提到的查询结果中。我将不得不保留旧名称。我担心的是,如果这个名字在某个地方被使用过,它在哪里?为什么我找不到?
  • 我在上面看到你的评论说你中止了add constraint。你还在使用同一个会话吗?尝试运行我在另一个会话中提到的查询,看看你是否找到它。
  • 刚刚在新会话中尝试了查询。还是没看到。外键已添加到访问表中。现在访问表甚至都不存在。那个外键怎么还存在?
  • 您找到解决方案了吗?我的情况完全一样。 FK 不在架构中,但不会创建它。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2010-12-17
  • 2016-06-08
  • 2012-03-17
相关资源
最近更新 更多