我使用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;
答案 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.
问题是Deliveries
和Orders
表都声明了一个名为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个主要键同时是外键,如果你想限制它们,它们会产生错误。
所以我只是省略了约束,一切正常。