2017-06-14 20 views
-1

サーバーにコードをプッシュしようとするたびにこのエラーメッセージが表示されます。MySQL Workbenchエラーコード:1215.外部キー制約を追加できません

私は外国人と主キーのデータ型を確認し、それらが一致しましたことを確認しましたが、私はまだ、次の表の問題を見つけることができませんしました:

-- ----------------------------------------------------- 
-- Table `testdb`.`Photo` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `testdb`.`Photo` (
    `nonprofit_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
    `campaign_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
    `photo_id` VARCHAR(40) NOT NULL, 
    `company_id` INT NOT NULL, 
    `date_created` DATETIME NOT NULL DEFAULT NOW(), 
    PRIMARY KEY (`nonprofit_photo_link`, `campaign_photo_link`), 
    INDEX `company_id_idx` (`company_id` ASC), 
    CONSTRAINT `company_id` 
    FOREIGN KEY (`company_id`) 
    REFERENCES `testdb`.`Company` (`company_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `testdb`.`Campaign` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `testdb`.`Campaign` (
    `campaign_id` INT NOT NULL AUTO_INCREMENT, 
    `campaign_name` VARCHAR(100) NOT NULL, 
    `time_created` DATETIME NOT NULL DEFAULT NOW(), 
    `time_start` DATETIME NOT NULL, 
    `time_end` DATETIME NOT NULL, 
    `total_goal` DOUBLE(9,2) NOT NULL, 
    `description` TEXT NULL, 
    `category` VARCHAR(255) NULL, 
    `tax_deductable` ENUM('yes', 'no') NULL DEFAULT 'no', 
    `campaign_sponsorship` VARCHAR(100) NOT NULL, 
    `phone_number` VARCHAR(12) NULL, 
    `street_address` VARCHAR(255) NULL, 
    `city` VARCHAR(255) NOT NULL, 
    `state` VARCHAR(2) NOT NULL, 
    `zip_code` INT(11) NULL, 
    `amazon_link` TEXT NULL, 
    `amazon_quantity` INT NULL, 
    `total_donated` DOUBLE NOT NULL DEFAULT 0, 
    `donation_remainder` DOUBLE NULL, 
    `photo_link` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`campaign_id`), 
    INDEX `photo_link_idx` (`photo_link` ASC), 
    CONSTRAINT `photo_link` 
    FOREIGN KEY (`photo_link`) 
    REFERENCES `testdb`.`Photo` (`campaign_photo_link`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `testdb`.`Nonprofit` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `testdb`.`Nonprofit` (
    `nonprofit_id` INT NOT NULL AUTO_INCREMENT, 
    `nonprofit_photo_link` VARCHAR(255) NOT NULL, 
    `state` VARCHAR(2) NOT NULL, 
    `nonprofit_name` VARCHAR(100) NOT NULL, 
    `street_address` VARCHAR(255) NULL, 
    `zip_code` INT(11) NULL, 
    `number_of_employees` INT NULL, 
    `type_of_business` VARCHAR(255) NULL, 
    `number_of_donors` INT NOT NULL DEFAULT 0, 
    `social_handle` VARCHAR(255) NULL, 
    `city` VARCHAR(255) NOT NULL, 
    INDEX `photo_link_idx` (`nonprofit_photo_link` ASC), 
    PRIMARY KEY (`nonprofit_id`), 
    CONSTRAINT `nonprofit_photo_link` 
    FOREIGN KEY (`nonprofit_photo_link`) 
    REFERENCES `testdb`.`Photo` (`nonprofit_photo_link`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

エラーコード:1215 。外部キー制約を追加することはできません

0.047秒

+1

完全なエラースタックトレースを追加してください。 – tom

+2

スキーマはキーワードですが、my_schemaという名前のデータベースを作成する必要があります。また、写真表も追加してください。 – tom

+0

私はスキーマの実際の名前の代わりにそこにスキーマを置いていました。だから、そのエラーの問題ではありませんでした。私はまた、写真のテーブルが含まれています。 –

答えて

0

エラーが原因Photoテーブルにあなたは複合主キーを持っているという事実のためであり、あなたがすなわち外部キーではない複合外国kとだけcampaign_photo_linkをしようとしていますこのエラーが発生したのはCampaignテーブルです。

Nonprofitの場合も同様です。

私はこれを行うと、すべてのテーブルが生成されます - セットで

mysql> show tables; 
    +------------------+ 
    | Tables_in_testdb | 
    +------------------+ 
    | Campaign   | 
    | Company   | 
    | Nonprofit  | 
    | Photo   | 
    +------------------+ 

4行(0.01秒)

mysql> select * from Nonprofit; 
Empty set (0.00 sec) 

mysql> desc Nonprofit; 
+---------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+---------------------+--------------+------+-----+---------+----------------+ 
| nonprofit_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| state    | varchar(2) | NO |  | NULL |    | 
| nonprofit_name  | varchar(100) | NO |  | NULL |    | 
| street_address  | varchar(255) | YES |  | NULL |    | 
| zip_code   | int(11)  | YES |  | NULL |    | 
| number_of_employees | int(11)  | YES |  | NULL |    | 
| type_of_business | varchar(255) | YES |  | NULL |    | 
| number_of_donors | int(11)  | NO |  | 0  |    | 
| social_handle  | varchar(255) | YES |  | NULL |    | 
| city    | varchar(255) | NO |  | NULL |    

| np_photo_link  | varchar(255) | NO | MUL | empty |    | 

| cp_photo_link  | varchar(255) | NO |  | empty |    | 
+---------------------+--------------+------+-----+---------+-------- 
--------+ 
12 rows in set (0.00 sec) 

mysql> desc Company; 
+------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+------------+---------+------+-----+---------+----------------+ 
| company_id | int(11) | NO | PRI | NULL | auto_increment | 
+------------+---------+------+-----+---------+----------------+ 
1 row in set (0.00 sec) 

mysql> desc Photo; 
+----------------------+--------------+------+-----+-------------------+-------+ 
| Field    | Type   | Null | Key | Default   | Extra | 
+----------------------+--------------+------+-----+-------------------+-------+ 
| campaign_photo_link | varchar(255) | NO | PRI | empty    |  | 
| nonprofit_photo_link | varchar(255) | NO | PRI | empty    |  | 
| photo_id    | varchar(40) | NO |  | NULL    |  | 
| company_id   | int(11)  | NO | MUL | NULL    |  | 
| date_created   | datetime  | NO |  | CURRENT_TIMESTAMP |  | 
+----------------------+--------------+------+-----+-------------------+-------+ 
5 rows in set (0.00 sec) 

概要 - mysqlコマンドラインで

CREATE TABLE IF NOT EXISTS `testdb`.`Company` (
     `company_id` INT NOT NULL AUTO_INCREMENT, 
      PRIMARY KEY (`company_id`)) 
ENGINE = InnoDB; 


    CREATE TABLE IF NOT EXISTS `testdb`.`Photo` (
     `campaign_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     `nonprofit_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     `photo_id` VARCHAR(40) NOT NULL, 
     `company_id` INT NOT NULL, 
     `date_created` DATETIME NOT NULL DEFAULT NOW(), 
     PRIMARY KEY (`nonprofit_photo_link`, `campaign_photo_link`), 
     INDEX `company_id_idx` (`company_id` ASC), 
     CONSTRAINT `company_id` 
     FOREIGN KEY (`company_id`) 
     REFERENCES `testdb`.`Company` (`company_id`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION) 
    ENGINE = InnoDB; 

    CREATE TABLE IF NOT EXISTS `testdb`.`Campaign` (
     `campaign_id` INT NOT NULL AUTO_INCREMENT, 
     `campaign_name` VARCHAR(100) NOT NULL, 
     `time_created` DATETIME NOT NULL DEFAULT NOW(), 
     `time_start` DATETIME NOT NULL, 
     `time_end` DATETIME NOT NULL, 
     `total_goal` DOUBLE(9,2) NOT NULL, 
     `description` TEXT NULL, 
     `category` VARCHAR(255) NULL, 
     `tax_deductable` ENUM('yes', 'no') NULL DEFAULT 'no', 
     `campaign_sponsorship` VARCHAR(100) NOT NULL, 
     `phone_number` VARCHAR(12) NULL, 
     `street_address` VARCHAR(255) NULL, 
     `city` VARCHAR(255) NOT NULL, 
     `state` VARCHAR(2) NOT NULL, 
     `zip_code` INT(11) NULL, 
     `amazon_link` TEXT NULL, 
     `amazon_quantity` INT NULL, 
     `total_donated` DOUBLE NOT NULL DEFAULT 0, 
     `donation_remainder` DOUBLE NULL, 
     `np_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     `cp_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     PRIMARY KEY (`campaign_id`), 
     INDEX `photo_link_idx` (`cp_photo_link` ASC), 
     CONSTRAINT `FK_photo_link` 
     FOREIGN KEY (`np_photo_link` , `cp_photo_link`) 
     REFERENCES `testdb`.`Photo` (`nonprofit_photo_link`, 
     `campaign_photo_link`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
    ENGINE = InnoDB; 


    CREATE TABLE IF NOT EXISTS `testdb`.`Nonprofit` (
     `nonprofit_id` INT NOT NULL AUTO_INCREMENT, 
     `state` VARCHAR(2) NOT NULL, 
     `nonprofit_name` VARCHAR(100) NOT NULL, 
     `street_address` VARCHAR(255) NULL, 
     `zip_code` INT(11) NULL, 
     `number_of_employees` INT NULL, 
     `type_of_business` VARCHAR(255) NULL, 
     `number_of_donors` INT NOT NULL DEFAULT 0, 
     `social_handle` VARCHAR(255) NULL, 
     `city` VARCHAR(255) NOT NULL, 
     `np_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     `cp_photo_link` VARCHAR(255) NOT NULL DEFAULT 'empty', 
     INDEX `photo_link_idx` (`np_photo_link` ASC), 
     PRIMARY KEY (`nonprofit_id`), 
     CONSTRAINT `nonprofit_photo_link` 
     FOREIGN KEY (`np_photo_link` , `cp_photo_link`) 
     REFERENCES `testdb`.`Photo` (`nonprofit_photo_link`, 
     `campaign_photo_link`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

出力: 私は複合主キーを両方のテーブル。あなたのユースケースに適しているかどうかはあなたのところまであります。あなたもCreating a Composite Foreign Key

を読むことができます

、それは場合に役立ちますHow Can I Create a Foreign Key from Composite Primary Key

は、私に知らせてチェック!

ありがとうございました

+0

@スティーブン、あなたが役に立つと思ったらこの回答をアップしてください – tom

関連する問題