外键约束形成错误(MariaDB)

时间:2017-10-27 20:38:36

标签: mysql sql mariadb

我只是尝试在MariaDB中执行MySQL文件,但它给了我以下错误:ERROR 1005 (HY000) at line 14: Can't create table roundcube.calendars (errno: 150 "Foreign key constraint is incorrectly formed")

这是SQL查询:https://pastebin.com/4FBA30JM 不幸的是,我无法将其发布在此处,因为它有点混淆了格式。

1 个答案:

答案 0 :(得分:2)

这是您的日历表定义:

CREATE TABLE IF NOT EXISTS `calendars` (
  `calendar_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL,
  `color` varchar(8) NOT NULL,
  `showalarms` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY(`calendar_id`),
  INDEX `user_name_idx` (`user_id`, `name`),
  CONSTRAINT `fk_calendars_user_id` FOREIGN KEY (`user_id`)
    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;

我在沙盒中测试了这个,声明很好。它没有错。

但是,我在链接的代码示例中看不到users表。在使用外键创建表之前,必须满足以下条件:

  • 引用的表格(在您的情况下为users)必须存在。
  • 引用的表必须使用InnoDB存储引擎。
  • 引用的列(user_id)必须存在于表中。
  • 引用的列必须与引用它的外键列具有完全相同的数据类型。在您的情况下,这是INT UNSIGNED(整数长度参数(10)是可选的,在两个表中可能不同。)
  • 引用的列必须是KEY的最左列。理想情况下,它应该是整个PRIMARY KEY或UNIQUE KEY,以与标准SQL兼容。从技术上讲,InnoDB还允许外键引用非唯一键,但不鼓励这样做。

因此,您必须拥有一个至少类似于数据库中已存在的表:

CREATE TABLE `users` (
  `user_id` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;

我必须在我的沙箱中创建此表,然后才能使用日历表定义。