Pergunta

Eu usei o MySQL Workbench para gerar um banco de dados e agora eu inseri-lo para o cliente de linha de comando usando:

mysql>. C: \ Documents and Settings \ kdegroote \ My Documentos \ Escola \ 2008-2009 \ ICT2 \ Gegevensbanken \ Labo \ Hoofdstuk 3 oef 6 \ pizzasecondtry.sql

Por alguma razão, a última tabela não serão aceitos. "Não é possível criar a tabela" é a mensagem de erro.

Eu editted manualmente os dados para ser basicamente o mesmo, só que sem as opções especiais Workbench adiciona a ele e funcionou assim.

Eu tenho estudado o original, mas eu não entendo por que ele não vai me mostrar as tabelas. Então eu queria saber se alguém aqui poderia ter um olhar para ele. Talvez alguém vai ver o que eu estou com vista.

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;
Foi útil?

Solução

Você pode muitas vezes obter mais informações a partir de um erro InnoDB como esta:

mysql> SHOW ENGINE INNODB STATUS;

A saída é longa, mas entre a saída de status Eu vi isso:

------------------------
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. 

O problema é que o Deliveries e as mesas Orders ambos declarar uma restrição de chave chamado employee_id estrangeira.

nomes de restrição deve ser exclusivo em todas as tabelas em um determinado banco de dados. O "errno: 121" é um código de erro InnoDB indicando um erro de chave duplicada. Neste caso, a singularidade de nomes de restrição não está satisfeito.

Você pode corrigir esse problema e ainda manter as suas restrições de chave estrangeira se você acabou de mudar o nome da restrição declarou, por exemplo:

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

Outras dicas

problema resolvido.

Eu resolvi meu problema aqui sim por acidente. O problema parecia ser as restrições na tabela de "entregas".

As 2 chaves primairy são chaves estrangeiras ao mesmo tempo e que gera e erro se você deseja restringir-los.

Então, eu simplesmente deixado de fora as restrições e tudo funciona.

use PizzaDelivery Tente antes de executar show tables. Você criou suas tabelas no esquema PizzaDelivery, mas você provavelmente conectado com um esquema padrão diferente. O esquema padrão é o parâmetro para o cliente de linha de comando mysql:

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

(nota:. Meio -p Solicitar senha quando não é dado um argumento, que você geralmente não deve fazer, porque os argumentos aparecem na saída do ps e também se salvou no disco na história shell Todos os parâmetros de linha de comando são opcionais.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top