簡體   English   中英

無法在MySQL中添加外鍵約束錯誤

[英]Cannot add foreign key constraint error in MySQL

在我的本地環境數據庫(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上不起作用。

問題可能出在數據庫不是空的。 在這種情況下,當其中一行不滿足外鍵要求時,將要求添加到整個表將失敗。

確保AWS RDS上的所有行都可以滿足要求,並且它們的外部記錄存在。

示例:假設您創建一個帶有books和user_id列的表。 您確定user_id的值為“ 0”表示沒有用戶分配給該行(書仍在庫中)。 然后,代碼更改,您將user_id實現為外鍵(user_id現在應指向“用戶”表,“ id”列,通常可以通過以下方式進行操作:

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

現在,如果您的數據庫中已有書籍,且user_id列的值為“ 0”,則查詢將失敗,因為有些記錄指向不存在的用戶(id為“ 0”)。 要解決此問題,您需要先使用即將失效的參考來更新記錄。 在這種特殊情況下,創建一個ID為123的“圖書管理員”用戶,然后執行以下操作: UPDATE books set user_id=123 WHERE user_id=0; 會做到這一點,並允許您毫無問題地創建外鍵。

您可以檢查創建表的順序嗎? 當您更改順序以使表(正在引用其主鍵)已經存在時,將不會發生此錯誤。

這里可能重復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM