mysql - 外键约束的格式不正确 (MariaDB)

标签 mysql sql mariadb

我只是想在 MariaDB 中执行一个 MySQL 文件,但它给了我以下错误:ERROR 1005 (HY000) at line 14: Can't create table roundcube.calendars (errno: 150 "Foreign关键约束形成不正确”)

这是 SQL 查询:https://pastebin.com/4FBA30JM 不幸的是,我不能在这里发布它,因为它有点困惑格式。

最佳答案

这是您的日历表定义:

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;

在您的日历表定义起作用之前,我必须在我的沙箱中创建此表。

关于mysql - 外键约束的格式不正确 (MariaDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46983069/

相关文章:

php - 在 MYSQL 数据库中存储和查询主题标签的最有效方法是什么

docker - Dockerfile,执行多个命令(CMD),但正在等待数据库提示?

Python 与 MariaDB 服务器的连接大约每 24 小时关闭一次

当 WHERE 条件之一结果为 false 时,MySQL 查询给出 null 值

php - Yii2 如何进行 where AND 或 OR 条件分组?

sql - 将 Postgres 查询结果合并到一个表中

mysql - 用户 '' 访问被拒绝(使用密码 : NO) but it does have password

MySQL count, group by 和 join 查询

php - 选择前 5 个结果 : PHP/SQL

sql - 拥有一个调用其他存储过程的存储过程是不好的吗?