【问题标题】:Mysql error 150 with foreigns keys带有外键的Mysql错误150
【发布时间】:2014-02-15 18:14:48
【问题描述】:

我有这个

CREATE  TABLE IF NOT EXISTS `beta`.`msg_messages` (
  `id_msg` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT ,
  `id_user_from` BIGINT(20) UNSIGNED NOT NULL ,
  `subject` VARCHAR(200) NOT NULL ,
  `body` TEXT NOT NULL ,
  `date` DATETIME NOT NULL ,
  PRIMARY KEY (`id_msg`) ,
  INDEX fk_msg_messages_user (`id_user_from` ASC) ,
  INDEX fk_msg_messages_msg_messages_users (`id_msg` ASC) ,
  CONSTRAINT `fk_msg_messages_user`
    FOREIGN KEY (`id_user_from` )
    REFERENCES `beta`.`user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_msg_messages_msg_messages_users`
    FOREIGN KEY (`id_msg` )
    REFERENCES `beta`.`msg_messages_users` (`id_msg` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB

*这是我的错误。这些也是我的 user 和 msg_messages_users 表。我已经查看了所有表格,但看不到我的错误。我正在使用 MysqlWorbench,它会生成这个错误的 sintax。*

错误 1005:无法创建表“beta.msg_messages”(错误号:150)。

CREATE  TABLE IF NOT EXISTS `beta`.`user` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT ,
  `username` VARCHAR(100) NOT NULL ,
   PRIMARY KEY (`id`) ,
ENGINE = InnoDB
AUTO_INCREMENT = 87
DEFAULT CHARACTER SET = utf8;

 CREATE  TABLE IF NOT EXISTS `beta`.`msg_messages_users` (
      `id` BIGINT UNSIGNED NOT NULL ,
      `id_usr_to` BIGINT(20) UNSIGNED NOT NULL ,
      `id_msg` BIGINT(20) UNSIGNED NOT NULL ,
      `status` TINYINT NOT NULL DEFAULT 0 ,
      `date` DATETIME NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX fk_msg_messages_users_user (`id_usr_to` ASC) ,
      CONSTRAINT `fk_msg_messages_users_user`
        FOREIGN KEY (`id_usr_to` )
        REFERENCES `beta`.`user` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;

【问题讨论】:

  • 也许id_msg BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT 应该只是id_msg BIGINT(20) UNSIGNED NOT NULL。自动递增的列如何引用其他表?
  • 请发布“SHOW ERRORS”和“SHOW ENGINE INNODB STATUS”的输出。自动增量是合法的(尽管它肯定很奇怪)。问题在于 fk_msg_messages_msg_messages_users 约束创建(如果删除它,它将创建表)
  • 140215 17:56:57 表 beta/msg_messages 的外键约束错误:FOREIGN KEY (id_msg) REFERENCES beta.msg_messages_users (id_msg) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB: 在被引用的列作为第一列出现的被引用表中找不到索引,或者表中的列类型与被引用表的约束不匹配。
  • 我在我的 msg_message_users 中看到了 id_msg 的索引,并且它们的类型正确匹配...
  • 我是个笨蛋...我在错误的表中声明了一个外键..lol

标签: mysql foreign-keys foreign-key-relationship mysql-error-1005


【解决方案1】:

我是个笨蛋……我在错误的表中声明了一个外键……

CREATE  TABLE IF NOT EXISTS `beta`.`msg_messages` (
  `id_msg` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT ,
  `id_user_from` BIGINT(20) UNSIGNED NOT NULL ,
  `subject` VARCHAR(200) NOT NULL ,
  `body` TEXT NOT NULL ,
  `date` DATETIME NOT NULL ,
  PRIMARY KEY (`id_msg`) ,
  INDEX fk_msg_messages_user (`id_user_from` ASC) ,
  CONSTRAINT `fk_msg_messages_user`
    FOREIGN KEY (`id_user_from` )
    REFERENCES `beta`.`user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `beta`.`msg_messages_users` (
  `id_msg` BIGINT(20) UNSIGNED NOT NULL ,
  `id_usr_to` BIGINT(20) UNSIGNED NOT NULL ,
  `status` TINYINT NOT NULL DEFAULT 0 ,
  `date` DATETIME NOT NULL ,
  INDEX id_msg (`id_msg` ASC) ,
  INDEX fk_msg_messages_users_msg_messages (`id_msg` ASC) ,
  INDEX fk_msg_messages_users_user (`id_usr_to` ASC) ,
  CONSTRAINT `fk_msg_messages_users_msg_messages`
    FOREIGN KEY (`id_msg` )
    REFERENCES `beta`.`msg_messages` (`id_msg` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_msg_messages_users_user`
    FOREIGN KEY (`id_usr_to` )
    REFERENCES `beta`.`user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多