2

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

mysql> . C:\Documents and Settings\kdegroote\My Documents\School\2008-2009\ICT2\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;
4

3 回答 3

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` )
  . . .
于 2008-12-21T20:07:00.603 回答
1

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

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

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

于 2008-12-21T18:28:14.483 回答
1

问题解决了。

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

这两个主键同时是外键,如果你想约束它们,就会产生错误。

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

于 2008-12-21T19:02:07.753 回答