Hur*_*rkS 5 mysql phpmyadmin mysql-workbench
我正在为我所在地区的商家信息设计一个sql db.我正在使用mySQL WorkBench来设计数据库,我怎么会遇到一些无法创建数据库中的表的问题.
这就是db设计的样子

我遇到的问题是BusinessHours,我发现它令人困惑,因为我想将它与BusinessDirectory的Foregin键(每个businessDirectory有很多BusinessHours)"一对多"联系起来,这样你就可以代表一周中的7天.希望有道理.
这是使用mySQL工作台生成的sql
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='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Members`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Members` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Members` (
`idMembers` INT NOT NULL AUTO_INCREMENT ,
`firstName` VARCHAR(45) NOT NULL ,
`lastName` VARCHAR(45) NOT NULL ,
`email` VARCHAR(45) NOT NULL ,
`password` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`idMembers`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessDirectory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessDirectory` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessDirectory` (
`idBusinessDirectory` INT NOT NULL ,
`businessName` VARCHAR(45) NOT NULL ,
`businessDescription` VARCHAR(1000) NULL ,
`businessLogo` VARCHAR(45) NULL ,
`idMembers` INT NULL ,
`directoryCategory` VARCHAR(45) NULL ,
PRIMARY KEY (`idBusinessDirectory`) ,
INDEX `idMembers_idx` (`idMembers` ASC) ,
CONSTRAINT `idMembers`
FOREIGN KEY (`idMembers` )
REFERENCES `mydb`.`Members` (`idMembers` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessAddress`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessAddress` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessAddress` (
`idBusinessDirectory` INT NOT NULL ,
`addressNumber` VARCHAR(5) NULL ,
`addressAreaName` VARCHAR(45) NULL ,
`addressLat` FLOAT(10,6) NULL ,
`addressLong` FLOAT(10,6) NULL ,
PRIMARY KEY (`idBusinessDirectory`) ,
CONSTRAINT `idBusinessDirectory`
FOREIGN KEY (`idBusinessDirectory` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessHours`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessHours` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessHours` (
`idBusinessDirectory` INT NOT NULL ,
`dayOfWeek` INT NULL ,
`openingTime` TIME NULL ,
`closingTime` TIME NULL ,
PRIMARY KEY (`idBusinessDirectory`) ,
CONSTRAINT `idBusinessDirectory`
FOREIGN KEY (`idBusinessDirectory` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
USE `mydb` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Run Code Online (Sandbox Code Playgroud)
所以我希望有人可以帮我弄清楚为什么我无法将BusinessHours表添加到我的数据库中.
这是两个屏幕截图,显示我在phpMyAdmin中收到的错误消息


任何帮助,将不胜感激
最终更新的sql;
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='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Members`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Members` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Members` (
`idMembers` INT NOT NULL AUTO_INCREMENT ,
`firstName` VARCHAR(45) NOT NULL ,
`lastName` VARCHAR(45) NOT NULL ,
`email` VARCHAR(45) NOT NULL ,
`password` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`idMembers`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessDirectory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessDirectory` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessDirectory` (
`idBusinessDirectory` INT NOT NULL ,
`businessName` VARCHAR(45) NOT NULL ,
`businessDescription` VARCHAR(1000) NULL ,
`businessLogo` VARCHAR(45) NULL ,
`idMembers` INT NULL ,
`directoryCategory` VARCHAR(45) NULL ,
PRIMARY KEY (`idBusinessDirectory`) ,
INDEX `idMembers_idx` (`idMembers` ASC) ,
CONSTRAINT `idMembers`
FOREIGN KEY (`idMembers` )
REFERENCES `mydb`.`Members` (`idMembers` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessAddress`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessAddress` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessAddress` (
`idBusinessDirectory_BusinessAddress` INT NOT NULL ,
`addressNumber` VARCHAR(5) NULL ,
`addressAreaName` VARCHAR(45) NULL ,
`addressLat` FLOAT(10,6) NULL ,
`addressLong` FLOAT(10,6) NULL ,
PRIMARY KEY (`idBusinessDirectory_BusinessAddress`) ,
CONSTRAINT `idBusinessDirectory_BusinessAddress`
FOREIGN KEY (`idBusinessDirectory_BusinessAddress` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`BusinessHours`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`BusinessHours` ;
CREATE TABLE IF NOT EXISTS `mydb`.`BusinessHours` (
`idBusinessDirectory_BusinessHours` INT NOT NULL ,
`dayOfWeek` INT NULL ,
`openingTime` TIME NULL ,
`closingTime` TIME NULL ,
PRIMARY KEY (`idBusinessDirectory_BusinessHours`) ,
CONSTRAINT `idBusinessDirectory_BusinessHours`
FOREIGN KEY (`idBusinessDirectory_BusinessHours` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
USE `mydb` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Run Code Online (Sandbox Code Playgroud)
这就是Foregin键选项卡应该是什么样子

谢谢你的帮助
外键的约束名称在表和idBusinessDirectory中重复。BusinessHoursBusinessAddress
为约束指定不同的名称。
更新
遵循正确的 FK 命名约定,这样就不会出现此类错误,并且仅通过约束的名称我们就可以知道该约束涉及的表。
fk_[referencing table name]_[referenced table name]_[referencing field name]
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下,约束将是
编辑用这个更新你的代码
BusinessAddress Table
CONSTRAINT `fk_BusinessAddress_BusinessDirectory_idBusinessDirectory`
FOREIGN KEY (`idBusinessDirectory` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
BusinessHours Table
CONSTRAINT `fk_BusinessHours_BusinessDirectory_idBusinessDirectory`
FOREIGN KEY (`idBusinessDirectory` )
REFERENCES `mydb`.`BusinessDirectory` (`idBusinessDirectory` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
Run Code Online (Sandbox Code Playgroud)
你所有的约束都存储在INFORMATION_SCHEMA.KEY_COLUMN_USAGEINNODB 中
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
1850 次 |
| 最近记录: |