我只是想在 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/