在我的本地环境数据库中(localhost:3306,mysql 5.7.20),一切正常。但在aws rds数据库(MySQL5.7.22)中, Unhandled rejection SequelizeDatabaseError: Cannot add foreign key constraint
出现错误。
完整日志如下。
Executing (default):
CREATE TABLE IF NOT EXISTS `folders`
(`id` CHAR(36) BINARY , `folderName` VARCHAR(255),
`folderCoverImage` VARCHAR(255), `createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NOT NULL, `fk_user_id` CHAR(36) BINARY,
`fk_category_id` CHAR(36) BINARY,
PRIMARY KEY (`id`),
FOREIGN KEY (`fk_user_id`) REFERENCES `users` (`id`)
ON DELETE CASCADE ON UPDATE RESTRICT,
FOREIGN KEY (`fk_category_id`) REFERENCES `categories` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
Unhandled rejection SequelizeDatabaseError: Cannot add foreign key constraint
用户:
CREATE TABLE IF NOT EXISTS `users` (`id` CHAR(36) BINARY , `username` VARCHAR(255), `email` VARCHAR(255) UNIQUE, `socialProvider` VARCHAR(255), `profileImg` TEXT, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
类别:
CREATE TABLE IF NOT EXISTS `categories` (`id` CHAR(36) BINARY , `name` VARCHAR(255) UNIQUE, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
执行(默认):显示索引自 categories
还有我的node.js代码。
Folder.associate = function associate () {
Folder.belongsTo(User, {
foreignKey: 'fk_user_id',
onDelete: 'CASCADE',
onUpdate: 'restrict'
});
Folder.hasMany(Work, {
as: 'Work',
foreignKey: 'fk_folder_id',
onDelete: 'CASCADE',
onUpdate: 'restrict'
});
Folder.belongsTo(Category, {
as: 'Category',
foreignKey: 'fk_category_id'
});
};
而且,表用户、类别、post、tag已经存在。
这里是创建表顺序http://sqlfiddle.com/#!9/2162ca型
我不知道为什么它不起作用。
2条答案
按热度按时间wgxvkvu91#
你能检查一下创建表的顺序吗。当您更改顺序以便表(其主键正在被引用)已经存在时,将不会发生错误。
此处可能重复
wwtsj6pe2#
问题可能是数据库不是空的。在这种情况下,当其中一行不满足外键要求时,将要求添加到整个表将失败。
确保aws rds上的所有行都能满足要求,并且有外来记录。
示例:假设您创建了一个包含books和user\ id列的表。您确定值为“0”的用户标识表示未向该行分配任何用户(图书仍在库中)。然后,代码更改,您将user\u id实现为一个外键(user\u id现在应该指向“user”表,“id”列,您通常会通过:
现在,如果您的数据库中已有用户id列值为“0”的书籍,查询将失败,因为有指向不存在的用户(id为“0”)的记录。要解决这个问题,您需要首先用breaked-soon-to-be-reference更新记录。在这种特殊情况下,创建一个id为123的“图书管理员”用户,然后执行以下操作:
UPDATE books set user_id=123 WHERE user_id=0;
这样做的诀窍,并允许您创建外键没有问题。