表在MySQL中是空的

时间:2008-12-21 18:23:39

标签: mysql database mysql-workbench

我使用MySQL Workbench生成数据库,现在我使用以下命令将其插入命令行客户端:

  

的MySQL> 。 C:\ Documents and   设置\ kdegroote \我的   文档\学校\ 2008- 2009年\ ICT 2   \ Gegevensbanken \ Labo \ Hoofdstuk 3 oef   6 \ pizzasecondtry.sql

由于某种原因,最后一张表将不被接受。 “无法创建表”是错误消息。

我手动编辑数据基本上是相同的,只是没有Workbench添加的特殊选项,它就像那样工作。

我一直在研究原版,但我不明白为什么它不会给我看表。 所以我想知道这里是否有人可以看看它。也许别人会看到我忽略的东西。

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';

CREATE SCHEMA IF NOT EXISTS `PizzaDelivery` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `PizzaDelivery`;


CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Visitors` (
  `visitor_id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `adres` VARCHAR(45) NOT NULL ,
  `telephone` MEDIUMBLOB NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`visitor_id`))ENGINE=InnoDB;


CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Employees` (
  `employee_id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`employee_id`))ENGINE=InnoDB;


CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Orders` (
  `order_id` INT NOT NULL AUTO_INCREMENT ,
  `pizza` VARCHAR(45) NOT NULL ,
  `extra` VARCHAR(45) NULL ,
  `kind` VARCHAR(45) NOT NULL ,
  `amount` VARCHAR(45) NOT NULL ,
  `visitor_id` INT NOT NULL ,
  `employee_id` INT NOT NULL ,
  `order_time` TIME NOT NULL ,
  PRIMARY KEY (`order_id`) ,
  INDEX `visitor_id` (`visitor_id` ASC) ,
  INDEX `employee_id` (`employee_id` ASC) ,
  CONSTRAINT `visitor_id`
    FOREIGN KEY (`visitor_id` )
    REFERENCES `PizzaDelivery`.`Visitors` (`visitor_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `employee_id`
    FOREIGN KEY (`employee_id` )
    REFERENCES `PizzaDelivery`.`Employees` (`employee_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)ENGINE=InnoDB;


CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Deliveries` (
  `employee_id` INT NOT NULL ,
  `order_id` INT NOT NULL ,
  `voertuig_id` INT NOT NULL ,
  `deliverytime` TIME NOT NULL ,
  PRIMARY KEY (`employee_id`, `order_id`) ,
  INDEX `employee_id` (`employee_id` ASC) ,
  INDEX `order_id` (`order_id` ASC) ,
  CONSTRAINT `employee_id`
    FOREIGN KEY (`employee_id` )
    REFERENCES `PizzaDelivery`.`Employees` (`employee_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `order_id`
    FOREIGN KEY (`order_id` )
    REFERENCES `PizzaDelivery`.`Orders` (`order_id` )
    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;

3 个答案:

答案 0 :(得分:4)

您经常可以从InnoDB错误中获取更多信息:

mysql> SHOW ENGINE INNODB STATUS;

输出很长,但在状态输出中我看到了:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
081221 12:02:36 Error in foreign key constraint creation 
for table `pizzadelivery/deliveries`.
A foreign key constraint of name `pizzadelivery/employee_id`
already exists. 

问题是DeliveriesOrders表都声明了一个名为employee_id的外键约束。

约束名称在给定数据库中的所有表中必须是唯一的。 “errno:121”是InnoDB错误代码,表示重复键错误。在这种情况下,不满足约束名称的唯一性。

如果您只是更改声明的约束的名称,则可以解决此问题并仍保留外键约束,例如:

CREATE TABLE IF NOT EXISTS `PizzaDelivery`.`Deliveries` (
  . . .
  CONSTRAINT `employee_id2`
    FOREIGN KEY (`employee_id` )
  . . .

答案 1 :(得分:1)

在运行show table之前尝试use PizzaDelivery。您在PizzaDelivery架构中创建了表,但是您可能使用不同的默认架构进行了连接。默认模式是mysql命令行客户端的参数:

$ mysql -h <db-host> -u <username> -p <schema-name>

(注意:-p表示没有给出参数时提示输入密码,你通常不应这样做,因为参数显示在ps输出中,并且也会在shell历史记录中保存到磁盘。所有命令行参数是可选的。)

答案 2 :(得分:1)

问题已解决。

我在这里解决了我的问题,而不是偶然。 问题似乎是“交付”表中的限制。

2个主要键同时是外键,如果你想限制它们,它们会产生错误。

所以我只是省略了约束,一切正常。