我已经看了好几篇文章,但没有找到我的问题的解决方案。我的怀疑是错误源于我试图用一个列引用两个不同表中的同一主键列。具体来说,该出价表具有也存在于投标人和item_round_status表中的外键simulation_id。出价表引用了这两个表的外键,但我希望在表中只使用一个simulation_id列。这是错误150问题的来源吗?从两个表中引用相同的外键列的MySQL错误150
-- -----------------------------------------------------
-- Table `kffg_simulations`.`item_round_status`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kffg_simulations`.`item_round_status` (
`simulation_id` INT NOT NULL ,
`round` INT NOT NULL ,
`clock_item_id` INT NOT NULL ,
`posted_price` BIGINT NOT NULL ,
`clock_price` BIGINT NOT NULL ,
PRIMARY KEY (`simulation_id`, `round`, `clock_item_id`) ,
INDEX `fk_item_round_status_clock_item1_idx` (`clock_item_id` ASC) ,
INDEX `fk_item_round_status_simulation1_idx` (`simulation_id` ASC) ,
CONSTRAINT `fk_item_round_status_clock_item1`
FOREIGN KEY (`clock_item_id`)
REFERENCES `kffg_simulations`.`clock_item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_item_round_status_simulation1`
FOREIGN KEY (`simulation_id`)
REFERENCES `kffg_simulations`.`simulation` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `kffg_simulations`.`bidder`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kffg_simulations`.`bidder` (
`simulation_id` INT NOT NULL ,
`idx` INT NOT NULL ,
`bidder_strategy_id` INT NOT NULL ,
`budget` BIGINT NOT NULL ,
PRIMARY KEY (`simulation_id`, `idx`) ,
INDEX `fk_bidder_simulation1_idx` (`simulation_id` ASC) ,
INDEX `fk_bidder_bidder_strategy1_idx` (`bidder_strategy_id` ASC) ,
CONSTRAINT `fk_bidder_simulation1`
FOREIGN KEY (`simulation_id`)
REFERENCES `kffg_simulations`.`simulation` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bidder_bidder_strategy1`
FOREIGN KEY (`bidder_strategy_id`)
REFERENCES `kffg_simulations`.`bidder_strategy` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `kffg_simulations`.`bid_type`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kffg_simulations`.`bid_type` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `kffg_simulations`.`bid_status`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kffg_simulations`.`bid_status` (
`id` INT NOT NULL AUTO_INCREMENT ,
`description` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `kffg_simulations`.`bid`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kffg_simulations`.`bid` (
`simulation_id` INT NOT NULL ,
`item_round_status_round` INT NOT NULL ,
`clock_item_id` INT NOT NULL ,
`bidder_idx` INT NOT NULL ,
`quantity` INT NOT NULL ,
`price` INT NOT NULL ,
`bid_type_id` INT NOT NULL ,
`switch_to_pea_category_id` INT NOT NULL ,
`backstop` BIGINT NULL ,
`bid_status_id` INT NOT NULL ,
`processed_demand` INT NOT NULL ,
PRIMARY KEY (`simulation_id`, `item_round_status_round`, `clock_item_id`, `bidder_idx`, `quantity`) ,
INDEX `fk_bid_item_round_status1_idx` (`simulation_id` ASC, `item_round_status_round` ASC, `clock_item_id` ASC) ,
INDEX `fk_bid_bidder1_idx` (`simulation_id` ASC, `bidder_idx` ASC) ,
INDEX `fk_bid_bid_type1_idx` (`bid_type_id` ASC) ,
INDEX `fk_bid_pea_category1_idx` (`switch_to_pea_category_id` ASC) ,
INDEX `fk_bid_bid_status1_idx` (`bid_status_id` ASC) ,
CONSTRAINT `fk_bid_item_round_status1`
FOREIGN KEY (`simulation_id` , `item_round_status_round` , `clock_item_id`)
REFERENCES `kffg_simulations`.`item_round_status` (`simulation_id` , `round` , `clock_item_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bidder1`
FOREIGN KEY (`bidder_idx` , `simulation_id`)
REFERENCES `kffg_simulations`.`bidder` (`idx` , `simulation_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bid_type1`
FOREIGN KEY (`bid_type_id`)
REFERENCES `kffg_simulations`.`bid_type` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_pea_category1`
FOREIGN KEY (`switch_to_pea_category_id`)
REFERENCES `kffg_simulations`.`pea_category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bid_status1`
FOREIGN KEY (`bid_status_id`)
REFERENCES `kffg_simulations`.`bid_status` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
更新,显示错误消息:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
170604 21:52:27 Error in foreign key constraint of table kffg_simulations/bid:
FOREIGN KEY (`simulation_id` , `item_round_status_round` , `clock_item_id`)
REFERENCES `kffg_simulations`.`item_round_status` (`simulation_id` , `round` , `clock_item_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bidder1`
FOREIGN KEY (`bidder_idx` , `simulation_id`)
REFERENCES `kffg_simulations`.`bidder` (`idx` , `simulation_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bid_type1`
FOREIGN KEY (`bid_type_id`)
REFERENCES `kffg_simulations`.`bid_type` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_pea_category1`
FOREIGN KEY (`switch_to_pea_category_id`)
REFERENCES `kffg_simulations`.`pea_category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_bid_bid_status1`
FOREIGN KEY (`bid_status_id`)
REFERENCES `kffg_simulations`.`bid_status` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
什么是确切的错误信息文本?另外:[外键使用和错误信息](https://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html)PS什么“但我只想使用表中的一个simulation_id列“是什么意思? – philipxy
@philipxy我唯一能看到的就是这个语句:“InnoDB允许一个外键引用任何索引列或者一组列,但是在被引用的表中,必须有一个索引,其中被引用的列被列为第一个列顺序相同“。投标人表键列是否为simulation_id,bidder_idx时,是否存在出价表列的顺序为simulation_id,round,item_id,bidder_idx的问题?是否在两个列之间导致问题? – german129