创建表失败,外键约束未正确形成

时间:2014-06-08 13:43:18

标签: mysql database foreign-key-relationship mariadb

主题

MariaDB InnoDB外键问题

想首先说我是InnoDB的新手并且昨天花了一整天阅读帖子我一路上尝试了很多东西让我现在所处的地方所以我已经被冲洗了或者是否有办法解决这个问题黑暗的森林。

我有一个表,它是我数据模型中许多表的核心。所以有这样的话:

create table users (id int not null auto_increment
, username varchar(255) NOT NULL
, password varchar(255) NOT NULL
, active int NOT NULL
, PRIMARY KEY (id))
ENGINE=InnoDB COLLATE=utf8_unicode_ci;

本周末决定快速清理我的FK上的一些DELETE / UPDATE条款......着名的最后一句话......

相关的表格示例在这里

create table athing (id int not null auto_increment
, name varchar(255) not null
, status varchar(255) not null
, created_by_user_id int 
, PRIMARY KEY (id)
, CONSTRAINT athing_fk1 FOREIGN KEY (created_by_user_id) REFERENCES users (id)
) ENGINE=InnoDB COLLATE=utf8_unicode_ci;

问题

修改“ATHING”表中的FK以包括ON DELETE SET NULL。保存修改一切似乎没问题。我正在使用HeidiSQL来执行此操作。

长话短说我在我的桌子列表中徘徊而且很低,看到我的USERS桌子已经消失了!通过大量的阅读和努力,我能够把事情清理干净,但感觉真的确保事情好,我把所有的FK指向USERS表并放弃了桌子。

现在当我尝试重新创建USERS表时,我收到此错误:

ERROR 1005 (HY000): Can't create table `sprintdb`.`system_users` (errno: 150 "Foreign key constraint is incorrectly formed")

在我第一次尝试这样做之后我注意到的是,当我认为我已经丢弃所有FK时,仍然存在残留的密钥,特别是在某些表上支持这些密钥的索引。在查询INNODB_SYS_TABLES和INNODB_SYS_INDEXES表时,我认为已删除的那些索引仍然存在于这些系统表中。

有没有办法超越这个我觉得在某个地方存在一些信息,无论是在文件系统中还是在数据库本身中需要刷新或删除,以便我可以继续前进... ?

1 个答案:

答案 0 :(得分:14)

我在使用第三方工具创建表格然后约束现有表格时多次收到此消息。这是以下两种情况之一:

  • int列的大小不同
  • int列有不同的标记(无法自动编码)

作为一个例子,我创建了一个带有工具的表,该工具以某种方式创建了一个列INT(10)而不是预期的INT(11)。虽然我在创建两者时只选择了INT,但它却搞砸了 - 从未追踪到原因。

长话短说,通常最好在创建表时明确说明INT大小。

在您的情况下,以下内容应该有效:

create table users (id int(11) not null auto_increment
, username varchar(255) NOT NULL
, password varchar(255) NOT NULL
, active int NOT NULL
, PRIMARY KEY (id))
ENGINE=InnoDB COLLATE=utf8_unicode_ci;

create table athing (id int(11) not null auto_increment
, name varchar(255) not null
, status varchar(255) not null
, created_by_user_id int(11) not null
, PRIMARY KEY (id)
, CONSTRAINT athing_fk1 FOREIGN KEY (created_by_user_id) REFERENCES users (id)
) ENGINE=InnoDB COLLATE=utf8_unicode_ci;