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

showtablesを実行する前に試してくださいuse PizzaDelivery。スキーマでテーブルを作成しましたPizzaDeliveryが、おそらく別のデフォルトスキーマに接続しました。デフォルトのスキーマは、mysqlコマンドラインクライアントへのパラメータです。

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

(注:-pは、引数が指定されていない場合にパスワードの入力を求めることを意味します。引数はps出力に表示され、シェル履歴でディスクに保存されるため、通常は実行しないでください。すべてのコマンドラインパラメーターはオプションです。 )。

于 2008-12-21T18:28:14.483 に答える
1

問題が解決しました。

私はここで私の問題を偶然に解決しました。問題は、「Deliveries」テーブルの制約にあるようです。

2 つの主キーは同時に外部キーであり、それらを制約する場合はエラーが発生します。

そのため、制約を省略しただけで、すべてが機能します。

于 2008-12-21T19:02:07.753 に答える