无法在mysql中添加外键约束错误

kuhbmx9i  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(345)

在我的本地环境数据库中(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型
我不知道为什么它不起作用。

wgxvkvu9

wgxvkvu91#

你能检查一下创建表的顺序吗。当您更改顺序以便表(其主键正在被引用)已经存在时,将不会发生错误。
此处可能重复

wwtsj6pe

wwtsj6pe2#

问题可能是数据库不是空的。在这种情况下,当其中一行不满足外键要求时,将要求添加到整个表将失败。
确保aws rds上的所有行都能满足要求,并且有外来记录。
示例:假设您创建了一个包含books和user\ id列的表。您确定值为“0”的用户标识表示未向该行分配任何用户(图书仍在库中)。然后,代码更改,您将user\u id实现为一个外键(user\u id现在应该指向“user”表,“id”列,您通常会通过:

ALTER TABLE database.books
  ADD FOREIGN KEY book_user_id(user_id) REFERENCES user(id);

现在,如果您的数据库中已有用户id列值为“0”的书籍,查询将失败,因为有指向不存在的用户(id为“0”)的记录。要解决这个问题,您需要首先用breaked-soon-to-be-reference更新记录。在这种特殊情况下,创建一个id为123的“图书管理员”用户,然后执行以下操作: UPDATE books set user_id=123 WHERE user_id=0; 这样做的诀窍,并允许您创建外键没有问题。

相关问题