简体   繁体   English

表创建表单MySQL Workbench上的MySQL 150错误(外键选项与列中的非null冲突,已修复)

[英]MySQL 150 error on table creation form mysql workbench (foreign key options conflict with not null in columns, FIXED)

So, i'm getting a pretty 150 error when I forward engineer a schema from mysql workbench. 因此,当我从mysql工作台正向设计一个架构时,我得到了一个相当大的150错误。

I have made sure all pk and fk have the same type. 我已确保所有pk和fk具有相同的类型。 All tables are innodb engine. 所有表都是innodb引擎。

Maybe I'm missing something silly here (and apologies if I did), but your help would be much appreciated. 也许我在这里错过了一些愚蠢的东西(如果我这样做的话,我很抱歉),但是您的帮助将不胜感激。

Here is the script that fails with 150 error: 这是失败并显示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';

SHOW WARNINGS;
CREATE SCHEMA IF NOT EXISTS `bis` DEFAULT CHARACTER SET latin1 ;
SHOW WARNINGS;
USE `bis` ;

-- -----------------------------------------------------
-- Table `bis`.`entities`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `bis`.`entities` ;

SHOW WARNINGS;
CREATE  TABLE IF NOT EXISTS `bis`.`entities` (
  `entity_name` VARCHAR(64) NOT NULL ,
  `entity_description` TEXT NULL DEFAULT NULL ,
  `entity_email` TEXT NOT NULL ,
  `entity_phone` VARCHAR(11) NULL DEFAULT NULL ,
  `entity_website` VARCHAR(64) NULL DEFAULT NULL ,
  PRIMARY KEY (`entity_name`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `bis`.`users`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `bis`.`users` ;

SHOW WARNINGS;
CREATE  TABLE IF NOT EXISTS `bis`.`users` (
  `user_name` VARCHAR(64) NOT NULL ,
  `user_entity` VARCHAR(64) NOT NULL ,
  `user_email` TEXT NOT NULL ,
  `user_password` CHAR(64) NOT NULL ,
  `user_salt` CHAR(64) NOT NULL ,
  `user_role` VARCHAR(45) NOT NULL ,
  `user_realName` VARCHAR(64) NOT NULL ,
  `user_surname` VARCHAR(64) NOT NULL ,
  `user_IDnumber` VARCHAR(13) NOT NULL ,
  `user_cellNumber` VARCHAR(11) NOT NULL ,
  PRIMARY KEY (`user_name`) ,
  INDEX `entity_id` (`user_entity` ASC) ,
  CONSTRAINT `entity_id`
    FOREIGN KEY (`user_entity` )
    REFERENCES `bis`.`entities` (`entity_name` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

SHOW WARNINGS;

-- -----------------------------------------------------
-- Table `bis`.`reports`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `bis`.`reports` ;

SHOW WARNINGS;
CREATE  TABLE IF NOT EXISTS `bis`.`reports` (
  `report_id` INT NOT NULL AUTO_INCREMENT ,
  `user_name` VARCHAR(64) NOT NULL ,
  `investigator_name` VARCHAR(64) NOT NULL ,
  `report_entity` VARCHAR(64) NOT NULL ,
  `report_finished` TINYINT(1) NULL DEFAULT false ,
  `submit_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
  `finished_date` TIMESTAMP NULL ,
  `report_PDFFile` LONGBLOB NULL ,
  PRIMARY KEY (`report_id`) ,
  INDEX `user_id` (`user_name` ASC) ,
  INDEX `investigator_id` (`investigator_name` ASC) ,
  INDEX `entity_id` (`report_entity` ASC) ,
  CONSTRAINT `user_id`
    FOREIGN KEY (`user_name` )
    REFERENCES `bis`.`users` (`user_name` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `investigator_id`
    FOREIGN KEY (`investigator_name` )
    REFERENCES `bis`.`users` (`user_name` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `entity_id`
    FOREIGN KEY (`report_entity` )
    REFERENCES `bis`.`entities` (`entity_name` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

SHOW WARNINGS;


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

And then the corresponding error: 然后相应的错误:

Executing SQL script in server

ERROR: Error 1005: Can't create table 'bis.users' (errno: 150)

CREATE  TABLE IF NOT EXISTS `bis`.`users` (
  `user_name` VARCHAR(64) NOT NULL ,
  `user_entity` VARCHAR(64) NOT NULL ,
  `user_email` TEXT NOT NULL ,
  `user_password` CHAR(64) NOT NULL ,
  `user_salt` CHAR(64) NOT NULL ,
  `user_role` VARCHAR(45) NOT NULL ,
  `user_realName` VARCHAR(64) NOT NULL ,
  `user_surname` VARCHAR(64) NOT NULL ,
  `user_IDnumber` VARCHAR(13) NOT NULL ,
  `user_cellNumber` VARCHAR(11) NOT NULL ,
  PRIMARY KEY (`user_name`) ,
  INDEX `entity_id` (`user_entity` ASC) ,
  CONSTRAINT `entity_id`
    FOREIGN KEY (`user_entity` )
    REFERENCES `bis`.`entities` (`entity_name` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1

SQL script execution finished: statements: 13 succeeded, 1 failed

The table users creates an index named entity_id and at the same time names the fk constraint entity_id . users创建一个索引,命名为entity_id ,同时将其命名为fk约束entity_id

I believe you cannot have an index and constraint with the same name. 我相信您不能有相同名称的索引和约束。

Try this: 尝试这个:

INDEX entity_id (user_entity ASC) ,
CONSTRAINT fk_user_entity          -- *** this is the change ***
  FOREIGN KEY (user_entity )
  REFERENCES bis.entities (entity_name )
  ON DELETE SET NULL
  ON UPDATE CASCADE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM