Pregunta

he usado MySQL Workbench para generar una base de datos y ahora lo insertó en el cliente de línea de comandos usando:

  

mysql>. C: \ Documents and   Settings \ kdegroote \ Mi   Documentos \ School \ 2008-2009 \ ICT2   \ Gegevensbanken \ Labo \ hoofdstuk 3 OEF   6 \ pizzasecondtry.sql

Por alguna razón, No se aceptarán la última mesa. "No se puede crear la tabla" es el mensaje de error.

Me Editted manualmente los datos a ser básicamente el mismo, solo que sin las opciones especiales Workbench agrega a él y funcionó así.

He estado estudiando el original, pero no entiendo por qué no me mostrará las tablas. Así que me preguntaba si alguien aquí podría tener una mirada en ella. Tal vez alguien va a ver lo que yo estoy pasando por alto.

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

Solución

A menudo se puede obtener más información de un error InnoDB como esto:

mysql> SHOW ENGINE INNODB STATUS;

La salida es larga, pero entre la salida de estado vi esto:

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

El problema es que el Deliveries y las mesas Orders tanto declaran una restricción de clave llamado employee_id extranjera.

Los nombres de restricción deben ser únicos en todas las tablas de una base de datos dada. El "Error: 121" es un código de error que indica un error de InnoDB clave duplicada. En este caso, la singularidad de nombres de restricción no está satisfecho.

Puede solucionar este problema y aún así mantener sus restricciones de clave externa si sólo cambia el nombre de la restricción declarada, por ejemplo:

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

Otros consejos

problema resuelto.

I resuelto mi problema en este caso más bien por accidente. El problema parecía ser las limitaciones en la tabla de "entregas".

Las 2 llaves primairy son claves ajenas al mismo tiempo y que genera y error si desea limitar ellos.

Así que simplemente se deja fuera de las limitaciones y todo funciona.

Trate use PizzaDelivery antes de ejecutar tablas muestran. Que creó las tablas en el esquema PizzaDelivery, pero probablemente conectado con un esquema predeterminado diferente. El esquema por defecto es el parámetro para el cliente de línea de comandos mysql:

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

(nota: -p significa preguntar por el password cuando no se le da un argumento, que por lo general no se debe hacer porque los argumentos aparecen en la salida de ps y también se guardan en el disco en la historia de la cáscara Todos los parámetros de línea de comandos. son opcionales.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top