【问题标题】:More foreign key in creating MySQL创建 MySQL 的更多外键
【发布时间】:2012-10-01 14:41:43
【问题描述】:

我正在尝试使用此脚本创建数据库。但我在黑洞里。我不知道现在该怎么办。这是我的 MySQL 代码。请有人踢我。

如果我使用一个外键没问题,但我不知道如何使用更多。

EROOR 是:

#1005 - Can't create table 'ruda_dev_souteze2.results' (errno: 150)

查询是:

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,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `ruda_dev_souteze2` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci ;

USE `ruda_dev_souteze2` ;

-- -----------------------------------------------------
-- Table `ruda_dev_souteze2`.`contests`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`contests` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `date` DATE NOT NULL ,
  `public` TINYINT(1) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
AUTO_INCREMENT = 11
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;


-- -----------------------------------------------------
-- Table `ruda_dev_souteze2`.`people`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`people` (
  `contest_id` BIGINT(20) NOT NULL ,
  `number` INT(11) NOT NULL ,
  `category` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `fname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `lname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  PRIMARY KEY (`contest_id`, `number`) ,
  INDEX `id_idx` (`contest_id` ASC) ,
  CONSTRAINT `cidfp`
    FOREIGN KEY (`contest_id` )
    REFERENCES `ruda_dev_souteze2`.`contests` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;


-- -----------------------------------------------------
-- Table `ruda_dev_souteze2`.`subjects`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`subjects` (
  `contest_id` BIGINT(20) NOT NULL ,
  `number` INT(11) NOT NULL ,
  `name` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `direct` TINYINT(1) NOT NULL ,
  `type` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `subjectscol` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NULL DEFAULT NULL ,
  PRIMARY KEY (`contest_id`, `number`) ,
  INDEX `id_idx` (`contest_id` ASC) ,
  CONSTRAINT `cidfs`
    FOREIGN KEY (`contest_id` )
    REFERENCES `ruda_dev_souteze2`.`contests` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;


-- -----------------------------------------------------
-- Table `ruda_dev_souteze2`.`results`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
  `contest_id` BIGINT(20) NOT NULL ,
  `subject_number` INT(11) NOT NULL ,
  `people_number` INT(11) NOT NULL ,
  `number_8c2` FLOAT(10,2) NULL DEFAULT NULL ,
  `time_time` TIME NULL DEFAULT NULL ,
  `time_frag` FLOAT(2,2) NULL DEFAULT NULL ,
  PRIMARY KEY (`contest_id`, `subject_number`, `people_number`) ,
  INDEX `cidfr_idx` (`contest_id` ASC) ,
  INDEX `snfr_idx` (`subject_number` ASC) ,
  INDEX `pnfr_idx` (`people_number` ASC) ,
  CONSTRAINT `cidfr`
    FOREIGN KEY (`contest_id` )
    REFERENCES `ruda_dev_souteze2`.`contests` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `snfr`
    FOREIGN KEY (`subject_number` )
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `pnfr`
    FOREIGN KEY (`people_number` )
    REFERENCES `ruda_dev_souteze2`.`people` (`number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;


-- -----------------------------------------------------
-- Table `ruda_dev_souteze2`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`users` (
  `username` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `fullname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  `password` BINARY(40) NOT NULL ,
  `access` CHAR(1) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL ,
  PRIMARY KEY (`username`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

【问题讨论】:

  • 您是否遇到错误(如果有,是什么)?您希望在哪些表/列上添加第二个/附加外键?我不是 70% 确定我了解您需要什么帮助。
  • 抱歉,您的问题是什么?您在 SQL 中定义了几个不同的 FOREIGN KEY,您是否遇到某种错误?

标签: php mysql sql mysql-workbench


【解决方案1】:

引用的列是BIGINT:

CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`subjects` (
  `contest_id` BIGINT(20) NOT NULL ,                           --- BIGINT
 ...

而引用是INT:

CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
  `contest_id` BIGINT(20) NOT NULL ,
  `subject_number` INT(11) NOT NULL ,                          --- INT
    ...
  CONSTRAINT `snfr`
    FOREIGN KEY (`subject_number` )
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

它们应该具有相同的数据类型。

【讨论】:

  • 哦,我有更多的主键。比赛(id),人(contest_id,编号),主题(contest_id,编号),结果(contest_id,people_number,subject_number)。在比赛中是 PK AUTOINCREMENT 和 BIGINT。而在其他情况下,只有这个 col 是 BIGINT,其他人只是 INT。
【解决方案2】:

我想我明白你在问什么(如果没有,请澄清)。

在您对results 表的CREATE TABLE 查询中,您尝试创建三个单独的FOREIGN KEY 列,每个列都转到不同的表。查询中的问题是这三行:

INDEX `cidfr_idx` (`contest_id` ASC) ,
INDEX `snfr_idx` (`subject_number` ASC) ,
INDEX `pnfr_idx` (`people_number` ASC) ,

如果您将INDEX 更改为KEY,它应该可以正常工作。此外,ASC 是默认设置 - 因此从技术上讲,您可以将其排除在外(但将其保留不会有任何影响。

因此,在这次小更新之后,results 表的 CREATE TABLE 应如下所示:

CREATE  TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
  `contest_id` BIGINT(20) NOT NULL ,
  `subject_number` INT(11) NOT NULL ,
  `people_number` INT(11) NOT NULL ,
  `number_8c2` FLOAT(10,2) NULL DEFAULT NULL ,
  `time_time` TIME NULL DEFAULT NULL ,
  `time_frag` FLOAT(2,2) NULL DEFAULT NULL ,
  PRIMARY KEY (`contest_id`, `subject_number`, `people_number`) ,
  KEY `cidfr_idx` (`contest_id`) ,
  KEY `snfr_idx` (`subject_number`) ,
  KEY `pnfr_idx` (`people_number`) ,
  CONSTRAINT `cidfr`
    FOREIGN KEY (`contest_id` )
    REFERENCES `ruda_dev_souteze2`.`contests` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `snfr`
    FOREIGN KEY (`subject_number` )
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `pnfr`
    FOREIGN KEY (`people_number` )
    REFERENCES `ruda_dev_souteze2`.`people` (`number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_czech_ci;

我在本地测试了包含更改的完整脚本,它运行良好 - 如果您有任何问题,请告诉我,我可以进一步调查。

【讨论】:

  • 我试过了。我用你的部分替换我的部分查询。我有这个错误:#1005 - 无法创建表 'ruda_dev_souteze2.results' (errno: 150) 我是由 phpmyadmin 做的。感谢您的关注!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2015-01-18
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多