Mysql
正向工程 EER 圖時出現錯誤 1005
我在 MySQL Workbench 中創建了一個 EER 圖(如下圖所示),並希望轉發工程師來建構數據庫。
在將模型選項配置為目標 MySQL 版本並從 SQL 程式碼中的所有索引中刪除“可見”一詞後(程式碼在這篇文章的底部),因為它觸發了一個錯誤,我遇到了 1005錯誤:
Executing SQL script in server ERROR: Error 1005: Can't create table `books`.`books` (errno: 150 "Foreign key constraint is incorrectly formed") SQL Code: -- ----------------------------------------------------- -- Table `books`.`books` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`books` ( `bookID` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL, `price` DECIMAL(10,2) NULL, `book_prices_book_priceID` INT(11) NOT NULL, `book_types_book_typeID` INT(11) NOT NULL, `transactions_transactionID` INT(11) NOT NULL, `transactions_transaction_types_transaction_typeID` INT(11) NOT NULL, `ISBN` VARCHAR(13) NULL, PRIMARY KEY (`bookID`), INDEX `fk_books_book_prices1_idx` (`book_prices_book_priceID` ASC), INDEX `fk_books_transactions1_idx` (`transactions_transactionID` ASC, `transactions_transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_books_book_prices1` FOREIGN KEY (`book_prices_book_priceID`) REFERENCES `books`.`book_prices` (`book_priceID`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_books_transactions1` FOREIGN KEY (`transactions_transactionID` , `transactions_transaction_types_transaction_typeID`) REFERENCES `books`.`transactions` (`transactionID` , `transaction_types_transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB SQL script execution finished: statements: 8 succeeded, 1 failed Fetching back view definitions in final form. Nothing to fetch
任何有關如何解決它的指導表示讚賞。
我使用的 SQL 程式碼如下:
-- MySQL Workbench Forward Engineering SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- ----------------------------------------------------- -- Schema books -- ----------------------------------------------------- -- ----------------------------------------------------- -- Schema books -- ----------------------------------------------------- CREATE SCHEMA IF NOT EXISTS `books` DEFAULT CHARACTER SET utf8 ; USE `books` ; -- ----------------------------------------------------- -- Table `books`.`book_prices` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`book_prices` ( `book_priceID` INT(11) NOT NULL AUTO_INCREMENT, `bookID` INT(11) NULL, `price` DECIMAL(10,2) NULL, `currency` CHAR(2) NULL, `date_start` DATETIME NULL, `date_end` DATETIME NULL, PRIMARY KEY (`book_priceID`)) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`transaction_types` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`transaction_types` ( `transaction_typeID` INT(11) NOT NULL AUTO_INCREMENT, `transactionID` INT(11) NULL, PRIMARY KEY (`transaction_typeID`)) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`transactions` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`transactions` ( `transactionID` INT(11) NOT NULL AUTO_INCREMENT, `transaction_types_transaction_typeID` INT(11) NOT NULL, `date` DATETIME NULL, PRIMARY KEY (`transactionID`), INDEX `fk_transactions_transaction_types1_idx` (`transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_transactions_transaction_types1` FOREIGN KEY (`transaction_types_transaction_typeID`) REFERENCES `books`.`transaction_types` (`transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`books` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`books` ( `bookID` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL, `price` DECIMAL(10,2) NULL, `book_prices_book_priceID` INT(11) NOT NULL, `book_types_book_typeID` INT(11) NOT NULL, `transactions_transactionID` INT(11) NOT NULL, `transactions_transaction_types_transaction_typeID` INT(11) NOT NULL, `ISBN` VARCHAR(13) NULL, PRIMARY KEY (`bookID`), INDEX `fk_books_book_prices1_idx` (`book_prices_book_priceID` ASC), INDEX `fk_books_transactions1_idx` (`transactions_transactionID` ASC, `transactions_transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_books_book_prices1` FOREIGN KEY (`book_prices_book_priceID`) REFERENCES `books`.`book_prices` (`book_priceID`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_books_transactions1` FOREIGN KEY (`transactions_transactionID` , `transactions_transaction_types_transaction_typeID`) REFERENCES `books`.`transactions` (`transactionID` , `transaction_types_transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`batch_transaction` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`batch_transaction` ( `transactionID` INT(11) NOT NULL AUTO_INCREMENT, `batchID` INT(11) NOT NULL, `transactions_transactionID` INT(11) NOT NULL, `transactions_transaction_types_transaction_typeID` INT(11) NOT NULL, `date` DATETIME NULL, PRIMARY KEY (`transactionID`), INDEX `fk_batch_transaction_transactions1_idx` (`transactions_transactionID` ASC, `transactions_transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_batch_transaction_transactions1` FOREIGN KEY (`transactions_transactionID` , `transactions_transaction_types_transaction_typeID`) REFERENCES `books`.`transactions` (`transactionID` , `transaction_types_transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`batches` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`batches` ( `batchID` INT(11) NOT NULL AUTO_INCREMENT, `batch_transaction_transactionID` INT(11) NULL, `book_typeID` INT(11) NOT NULL, `price` DECIMAL(10,2) NULL, `supplierID` INT(11) NULL, PRIMARY KEY (`batchID`), INDEX `fk_batches_batch_transaction1_idx` (`batch_transaction_transactionID` ASC), CONSTRAINT `fk_batches_batch_transaction1` FOREIGN KEY (`batch_transaction_transactionID`) REFERENCES `books`.`batch_transaction` (`transactionID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`book_types` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`book_types` ( `book_typeID` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL, `books_bookID` INT(11) NOT NULL, `books_book_prices_book_priceID` INT(11) NOT NULL, `books_book_types_book_typeID` INT(11) NOT NULL, `batches_batchID` INT(11) NOT NULL, PRIMARY KEY (`book_typeID`), INDEX `fk_product_types_products1_idx` (`books_bookID` ASC, `books_book_prices_book_priceID` ASC, `books_book_types_book_typeID` ASC), INDEX `fk_product_types_batches1_idx` (`batches_batchID` ASC), CONSTRAINT `fk_book_types_books1` FOREIGN KEY (`books_bookID` , `books_book_prices_book_priceID` , `books_book_types_book_typeID`) REFERENCES `books`.`books` (`bookID` , `book_prices_book_priceID` , `book_types_book_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_book_types_batches1` FOREIGN KEY (`batches_batchID`) REFERENCES `books`.`batches` (`batchID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`suppliers` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`suppliers` ( `supplierID` INT(11) NOT NULL AUTO_INCREMENT, `batches_batchID` INT(11) NOT NULL, `name` VARCHAR(255) NULL, PRIMARY KEY (`supplierID`), INDEX `fk_suppliers_batches1_idx` (`batches_batchID` ASC), CONSTRAINT `fk_suppliers_batches1` FOREIGN KEY (`batches_batchID`) REFERENCES `books`.`batches` (`batchID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`customer_transaction` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`customer_transaction` ( `transactionID` INT(11) NOT NULL AUTO_INCREMENT, `customerID` INT(11) NULL, `transactions_transactionID` INT(11) NOT NULL, `date` DATETIME NULL, PRIMARY KEY (`transactionID`), INDEX `fk_client_transaction_transactions1_idx` (`transactions_transactionID` ASC), CONSTRAINT `fk_customer_transaction_transactions1` FOREIGN KEY (`transactions_transactionID`) REFERENCES `books`.`transactions` (`transactionID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`customers` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`customers` ( `customerID` INT(11) NOT NULL AUTO_INCREMENT, `books_bookID` INT(11) NULL, `books_book_prices_book_priceID` INT(11) NOT NULL, `books_book_types_book_typeID` INT(11) NOT NULL, `customer_transaction_transactionID` INT(11) NOT NULL, PRIMARY KEY (`customerID`), INDEX `fk_clients_products1_idx` (`books_bookID` ASC, `books_book_prices_book_priceID` ASC, `books_book_types_book_typeID` ASC), INDEX `fk_clients_client_transaction1_idx` (`customer_transaction_transactionID` ASC), CONSTRAINT `fk_customrs_products1` FOREIGN KEY (`books_bookID` , `books_book_prices_book_priceID` , `books_book_types_book_typeID`) REFERENCES `books`.`books` (`bookID` , `book_prices_book_priceID` , `book_types_book_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_customers_customer_transaction1` FOREIGN KEY (`customer_transaction_transactionID`) REFERENCES `books`.`customer_transaction` (`transactionID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`discounts` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`discounts` ( `discountID` INT(11) NOT NULL AUTO_INCREMENT, `Name` VARCHAR(255) NOT NULL, `transactions_transactionID` INT(11) NULL, `transactions_transaction_types_transaction_typeID` INT(11) NULL, PRIMARY KEY (`discountID`), INDEX `fk_discounts_transactions1_idx` (`transactions_transactionID` ASC, `transactions_transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_discounts_transactions1` FOREIGN KEY (`transactions_transactionID` , `transactions_transaction_types_transaction_typeID`) REFERENCES `books`.`transactions` (`transactionID` , `transaction_types_transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`discount_types` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`discount_types` ( `discount_typeID` INT(11) NOT NULL AUTO_INCREMENT, `Type` VARCHAR(255) NULL, `discounts_discountID` INT(11) NOT NULL, PRIMARY KEY (`discount_typeID`), INDEX `fk_discount_types_discounts1_idx` (`discounts_discountID` ASC), CONSTRAINT `fk_discount_types_discounts1` FOREIGN KEY (`discounts_discountID`) REFERENCES `books`.`discounts` (`discountID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `books`.`storagedistribution` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `books`.`storagedistribution` ( `storagedistributionID` INT(11) NOT NULL AUTO_INCREMENT, `Name` VARCHAR(255) NULL, `transactions_transactionID` INT(11) NOT NULL, `transactions_transaction_types_transaction_typeID` INT(11) NOT NULL, PRIMARY KEY (`storagedistributionID`), INDEX `fk_storagedistribution_transactions1_idx` (`transactions_transactionID` ASC, `transactions_transaction_types_transaction_typeID` ASC), CONSTRAINT `fk_storagedistribution_transactions1` FOREIGN KEY (`transactions_transactionID` , `transactions_transaction_types_transaction_typeID`) REFERENCES `books`.`transactions` (`transactionID` , `transaction_types_transaction_typeID`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
通過更新圖中的關係解決了問題。
第一個圖是非規範化的,如果有理由,這不一定是壞事(一致性由 FK 約束強制執行)。
我最終只引用了“父”表的 PK,作為父表
_types
。最終圖:
錯誤 150:
方案A:重新排列順序
CREATE TABLEs
計劃 B:禁用 FK,創建表,啟用 FK。
計劃 C:創建沒有 FK 的表,然後添加
ALTERs
以添加 FK。