mariadb 创建表失败,外键约束的格式不正确

llew8vvj  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(174)

主题

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迅速本周末...著名的遗言...
此处是相关的表示例

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执行此操作。
长话短说,我是trolling通过我的表列表和低,看我的用户表不见了!通过大量的阅读和努力,我能够得到的东西清理,但觉得要真正确保事情是好的,我放弃了所有的FK指向用户表,并放弃了表。
现在,当我尝试重新创建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表时,我认为被删除的那些索引仍然存在于这些系统表中。
是否有办法超越这一点?我觉得在文件系统或数据库本身的某个地方存在着一些信息,需要刷新或删除,以便我能够向前迈进......想法?

db2dz4w8

db2dz4w81#

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

  • int列具有不同的大小
  • int列具有不同的标志(无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;
wwwo4jvm

wwwo4jvm2#

在我的例子中,当我创建数据结构的SQL脚本中包含一个外键,该外键引用了一个 * 尚未 * 创建的表时,我收到了这个错误。解决方法是将创建引用表的操作 * 移到 * 创建目标表之后。

相关问题