سؤال

لقد استخدمت MySQL Workbench لتوليد قاعدة بيانات والآن أدخلت عليه في عميل سطر الأوامر باستخدام:

mysql>. C: المستندات والإعدادات Kdegreoote المستندات School 2008-2009 ICT2 Gejvensbanken Labo Hoofdstuk 3 OEF 6 PizzaSeconDer.SQL

لسبب ما، لن يتم قبول الجدول الأخير. "لا يمكن إنشاء جدول" هو رسالة الخطأ.

لقد عدلت البيانات يدويا أن تكون هي نفسها بشكل أساسي، فقط بدون خيارات عمل الخيارات الخاصة يضيف إليها وعملت هكذا.

لقد كنت أدرس الأصل لكنني لا أفهم لماذا لن تظهر لي الجداول. لذلك كنت أتساءل ما إذا كان هناك أي شخص هنا يمكن أن ينظر إليه. ربما شخص آخر سوف يرى ما أشرف عليه.

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;
هل كانت مفيدة؟

المحلول

يمكنك في كثير من الأحيان الحصول على مزيد من المعلومات من خطأ 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` )
  . . .

نصائح أخرى

تم حل المشكلة.

أنا حل مشكلتي هنا بدلا من ذلك عن طريق الصدفة. يبدو أن المشكلة هي القيود في جدول "التسليم".

مفاتيح الأسامة 2 هي مفاتيح أجنبية في نفس الوقت والتي تنشئ والخطأ إذا كنت ترغب في تقييدها.

لذلك أنا ببساطة تركت القيود ويعمل كل شيء.

يحاول use PizzaDelivery قبل تشغيل جداول المعرض. قمت بإنشاء جداولك في PizzaDelivery مخطط، ولكن ربما تكون مرتبطا بمخطط افتراضي مختلف. المخطط الافتراضي هو المعلمة إلى عميل سطر الأوامر MySQL:

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

(ملاحظة: -P يعني المطالبة بكلمة مرور عندما لا يتم منحها حجة، والتي لا ينبغي أن تفعلها بشكل عام لأن الحجج تظهر في إخراج PS وكذلك حفظها على القرص في سجل شل. جميع معلمات سطر الأوامر اختيارية. في

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top