Не удается добавить ошибку ограничения внешнего ключа в MySQL - PullRequest
0 голосов
/ 03 сентября 2018

В моей локальной базе данных (localhost: 3306, mysql 5.7.20) все работает нормально. но в базе данных aws RDS (mysql 5.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'
  });
};

также, пользователи таблиц, категории, записи, теги существовали.

Создать заказ стола можно здесь http://sqlfiddle.com/#!9/2162ca

Я не знаю, почему это не работает на AWS RDS.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Можете ли вы проверить порядок создания таблиц. При изменении порядка так, чтобы таблица (на первичный ключ которой ссылается) уже существовала, ошибка не возникнет.

Возможный дубликат здесь

0 голосов
/ 03 сентября 2018

Возможно, проблема в том, что база данных не пуста. В таком случае, когда одна из строк не соответствует требованию внешнего ключа, добавление требования ко всей таблице завершится неудачей.

Убедитесь, что все строки в AWS RDS могут выполнить требование и что существуют их внешние записи.

Пример: допустим, вы создали таблицу с книгами и столбцом user_id. Вы решаете, что user_id со значением «0» означает, что ни один пользователь не был назначен в строку (книга все еще находится в библиотеке). Затем код изменяется, и вы реализуете user_id как внешний ключ (user_id должен теперь указывать на таблицу «user», столбец «id»). что вы обычно делаете через:

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

Теперь, если в вашей базе данных уже есть книги со столбцом user_id, имеющим значение «0», запрос не будет выполнен, поскольку есть записи, указывающие на несуществующего пользователя (с идентификатором «0»). Чтобы это исправить, вам нужно сначала обновить записи с недействительными ссылками. В этом конкретном случае создаем пользователя-библиотекаря с некоторым идентификатором, например, 123, затем делаем: UPDATE books set user_id=123 WHERE user_id=0; Сделал бы трюк и позволил бы вам создать внешний ключ без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...