【问题标题】:Can't create table (errno: 150) with added KEY无法使用添加的 KEY 创建表 (errno: 150)
【发布时间】:2014-06-07 02:22:00
【问题描述】:

我在将部分数据库添加到就绪数据库时遇到问题。 它看起来像:

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

-- -----------------------------------------------------
-- Table `kreker92_diplom`.`diplom_sites_users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kreker92_diplom`.`diplom_sites_users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `idusers` INT NOT NULL,
  `idsite` INT NOT NULL,
  `datecreate` DATETIME NOT NULL,
  `dateedit` DATETIME NULL,
  PRIMARY KEY (`id`, `idsite`, `idusers`),
  INDEX `fk_diplom_sites_users_diplom_users1_idx` (`idusers` ASC),
  CONSTRAINT `fk_diplom_sites_users_diplom_users1`
    FOREIGN KEY (`idusers`)
    REFERENCES `kreker92_diplom`.`diplom_users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `kreker92_diplom`.`diplom_sites_data`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kreker92_diplom`.`diplom_sites_data` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `idsite` INT NOT NULL,
  `siteurl` VARCHAR(200) NOT NULL,
  `mobsiteurl` VARCHAR(200) NOT NULL,
  `uridir` VARCHAR(100) NOT NULL,
  `sitetype` VARCHAR(45) NOT NULL,
  `panelstyle` VARCHAR(45) NOT NULL,
  `publish` TINYINT(1) NOT NULL,
  `multilang` TINYINT(1) NOT NULL,
  `callbtn` TINYINT(1) NOT NULL,
  `sinchronization` TIME NULL,
  PRIMARY KEY (`id`, `idsite`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `kreker92_diplom`.`diplom_sites`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kreker92_diplom`.`diplom_sites` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `idsite` INT NOT NULL,
  `datecreate` DATETIME NOT NULL,
  `dateedit` DATETIME NULL,
  `sites_data_idsite` INT NOT NULL,
  KEY ix_diplom_sites_idsite (idsite),
  PRIMARY KEY (`id`, `idsite`),
  CONSTRAINT `fk_sites_users`
    FOREIGN KEY (`idsite`)
    REFERENCES `kreker92_diplom`.`diplom_sites_users` (`idsite`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sites_sites_data1`
    FOREIGN KEY (`idsite`)
    REFERENCES `kreker92_diplom`.`diplom_sites_data` (`idsite`)
    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;

但是 phpMyAdmin 很遗憾:

1005 - 无法创建表 'kreker92_diplom.diplom_sites'(错误号:150)

abd 开始于:

-- -----------------------------------------------------
-- Table `kreker92_diplom`.`diplom_sites`
-- -----------------------------------------------------

但我已经做了一个 KEY:

KEY ix_diplom_sites_idsite (idsite),

那么我做错了什么?

【问题讨论】:

    标签: mysql create-table errno


    【解决方案1】:

    要成为foreign key 的字段,其父字段必须定义'INDEX'
    根据foreign key 约束的文档:

    REFERENCES tbl_name (index_col_name,...)

    'diplom_sites' 表中,

    CONSTRAINT `fk_sites_users`
        FOREIGN KEY (`idsite`)
        REFERENCES `kreker92_diplom`.`diplom_sites_users` (`idsite`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
    

    引用的父字段'diplom_sites_users( idsite )' 没有定义'key',它只是复合键的一部分。在上面定义一个单独的键。

    CREATE TABLE IF NOT EXISTS `kreker92_diplom`.`diplom_sites_users` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `idusers` INT NOT NULL,
      `idsite` INT NOT NULL,
      `datecreate` DATETIME NOT NULL,
      `dateedit` DATETIME NULL,
    
      INDEX `ix_users_idsite`( `idsite` ), -- <------ this was missing
    
      PRIMARY KEY (`id`, `idsite`, `idusers`),
      INDEX `fk_diplom_sites_users_diplom_users1_idx` (`idusers` ASC),
      CONSTRAINT `fk_diplom_sites_users_diplom_users1`
        FOREIGN KEY (`idusers`)
        REFERENCES `kreker92_diplom`.`diplom_users` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    ) ENGINE = InnoDB;
    

    参考

    [CONSTRAINT [符号]] 外键
    [index_name] (index_col_name, ...)
    参考 tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

    reference_option:
    限制 |级联 |设置空 |没有行动

    【讨论】:

    • 感谢您的帮助!我已经添加了 INDEX ix_diplom_sites_users_idsite( idsite ),你说的地方,但我仍然有同样的错误
    • 也为其他引用的列添加类似的索引。例如,diplom_sites_data.idsite 也需要定义索引。您必须为所有此类引用字段定义索引。
    • 我发现了错误。我需要删除 ENGINE = InnoDB。
    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 2014-04-05
    • 2010-12-17
    • 2016-06-08
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多