【问题标题】:database table not being created未创建数据库表
【发布时间】:2013-03-07 18:48:04
【问题描述】:

我正在为我所在地区的企业列表设计一个 sql 数据库。我正在使用 mySQL WorkBench 设计数据库,但是我遇到了无法创建数据库中的一个表的问题。

这就是数据库设计的样子

我遇到的问题是 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;

所以我希望有人能帮我弄清楚为什么我无法将 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;

这就是 Foregin 键选项卡的样子

感谢大家的帮助

【问题讨论】:

    标签: mysql phpmyadmin mysql-workbench


    【解决方案1】:

    外键的约束名称idBusinessDirectory在表BusinessHoursBusinessAddress中重复。

    为约束赋予不同的名称。

    更新

    遵循正确的 FK 命名约定,这样就不会出现此类错误,并且仅通过约束的名称我们就可以知道约束中涉及的表。

    fk_[referencing table name]_[referenced table name]_[referencing field name]
    

    所以在你的情况下,约束将是

    EDIT 用这个更新你的代码

    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)
    

    您所有的约束都存储在 INNODB 中的 INFORMATION_SCHEMA.KEY_COLUMN_USAGE

    REFER

    希望对你有帮助。

    【讨论】:

    • idBusinessDirectory 是 BusinessDirectory 的 PK,它应该是 BusinessAddress 和 BusinessHours 的 FK,如果我希望它成为我的 FK,是否应该进行更改?
    • MySQL WorkBench 应该自动处理这个问题,但它没有
    • @AbdullahShaikh 你在说什么它应该自动处理但dosnt?
    • 我的意思是 MySQL WorkBench 应该自动处理重复的约束名称,但它没有,你必须手动检查
    • @Meherzad 非常感谢您提供的代码示例!我现在明白了……它让我明白了它在 mySQL WorkBench 界面中是如何工作的……我知道现在该做什么了 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2022-10-13
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多