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

Joh*_*ohn 6 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;
Run Code Online (Sandbox Code Playgroud)

决定在本周末快速清理我的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;
Run Code Online (Sandbox Code Playgroud)

问题

修改了"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")
Run Code Online (Sandbox Code Playgroud)

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

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

h0t*_*1r3 15

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

  • 该int列具有不同的尺寸
  • 该int列有不同的标志(SANS AUTO_INCREMENT)

作为一个例子,我创建了一个带有工具的表,该工具以某种方式创建了一个列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;
Run Code Online (Sandbox Code Playgroud)

  • 还值得检查表匹配的存储引擎.例如,尝试在InnoDB和MyISAM之间设置FK将失败 (7认同)