Question

I got this error "ERROR: Error 1005: Can't create table (errno: 150)" with all my table with constraints on foreign keys.

Executing SQL script in server    
ERROR: Error 1005: Can't create table 'shop_online.t_newsletters' (errno: 150)
CREATE  TABLE IF NOT EXISTS `shop_online`.`t_newsletters` (
  `id_newsletter` INT(11) NOT NULL AUTO_INCREMENT ,   
  `title` VARCHAR(45) NULL DEFAULT NULL ,
  `content` TEXT NULL DEFAULT NULL ,
  `author` INT(11) NOT NULL ,
  `creation` DATE NULL DEFAULT NULL ,
  PRIMARY KEY (`id_newsletter`, `author`) ,  
  INDEX `fk_t_newsletters_t_administrators1` (`author` ASC) ,  
  CONSTRAINT `fk_t_newsletters_t_administrators1`
    FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` ) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE) 
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci

resulted in:

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

I'm working with MySQL Workbench and this is the model : http://puu.sh/42CTd.png.

I am trying that because I don't want to lose any of the entries on my DB if I delete a user.

If you have another solution, I'm ready to try it!

EDIT : All the database

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

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_newsletters` (
  `id_newsletter` INT(11) NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(45) NULL DEFAULT NULL ,
  `content` TEXT NULL DEFAULT NULL ,
  `author` INT(11) NULL DEFAULT NULL ,
  `creation` DATE NULL DEFAULT NULL ,
  PRIMARY KEY (`id_newsletter`, `author`) ,
  INDEX `fk_t_newsletters_t_administrators1` (`author` ASC) ,
  CONSTRAINT `fk_t_newsletters_t_administrators1`
  FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_daily_tips` (
`id_daily_tip` INT(11) NOT NULL AUTO_INCREMENT ,
`title` VARCHAR(45) NULL DEFAULT NULL ,
  `content` TEXT NULL DEFAULT NULL ,
  `author` INT(11) NULL DEFAULT NULL ,
  PRIMARY KEY (`id_daily_tip`, `author`) ,
  INDEX `fk_t_daily_tips_t_administrators1` (`author` ASC) ,
  CONSTRAINT `fk_t_daily_tips_t_administrators1`
    FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_news` (
  `id_news` INT(11) NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(45) NULL DEFAULT NULL ,
  `introduction` TEXT NULL DEFAULT NULL ,
  `content` TEXT NULL DEFAULT NULL ,
  `author` INT(11) NULL DEFAULT NULL ,
  `creation` DATE NULL DEFAULT NULL ,
  `modification` DATE NULL DEFAULT NULL ,
  `modificator` INT(11) NULL DEFAULT NULL ,
  PRIMARY KEY (`id_news`, `modificator`, `author`) ,
  INDEX `fk_t_news_t_administrators1` (`author` ASC) ,
  INDEX `fk_t_news_t_administrators2` (`modificator` ASC) ,
  CONSTRAINT `fk_t_news_t_administrators1`
    FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_t_news_t_administrators2`
    FOREIGN KEY (`modificator` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_magazines` (
  `id_magazine` INT(11) NOT NULL AUTO_INCREMENT ,
  `file` VARCHAR(128) NULL DEFAULT NULL ,
  `view` INT(11) NULL DEFAULT NULL ,
  `author` INT(11) NULL DEFAULT NULL ,
  PRIMARY KEY (`id_magazine`, `author`) ,
  INDEX `fk_t_magazines_t_administrators1` (`author` ASC) ,
  CONSTRAINT `fk_t_magazines_t_administrators1`
    FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_members` (
  `id_member` INT(11) NOT NULL AUTO_INCREMENT ,
  `email` VARCHAR(326) NULL DEFAULT NULL ,
  `nickname` VARCHAR(45) NULL DEFAULT NULL ,
  `title` ENUM('M','Mme','Mlle','Dr','Me') NULL DEFAULT NULL ,
  `firstname` VARCHAR(45) NULL DEFAULT NULL ,
  `lastname` VARCHAR(45) NULL DEFAULT NULL ,
  `address` VARCHAR(128) NULL DEFAULT NULL ,
  `postal_code` VARCHAR(45) NULL DEFAULT NULL ,
  `city` VARCHAR(45) NULL DEFAULT NULL ,
  `country` VARCHAR(45) NULL DEFAULT NULL ,
  `phone` VARCHAR(45) NULL DEFAULT NULL ,
  PRIMARY KEY (`id_member`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_categories` (
  `id_category` INT(11) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NULL DEFAULT NULL ,
  PRIMARY KEY (`id_category`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_sub_categories` (
  `id_sub_category` INT(11) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NULL DEFAULT NULL ,
  `category` INT(11) NOT NULL ,
  PRIMARY KEY (`id_sub_category`, `category`) ,
  INDEX `fk_t_sub_categories_t_categories1` (`category` ASC) ,
  CONSTRAINT `fk_t_sub_categories_t_categories1`
    FOREIGN KEY (`category` )
    REFERENCES `shop_online`.`t_categories` (`id_category` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_articles` (
 `id_article` INT(11) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(256) NULL DEFAULT NULL ,
  `description` TEXT NULL DEFAULT NULL ,
  `price` DECIMAL(5,2) NULL DEFAULT NULL ,
  `stock` INT(11) NULL DEFAULT NULL ,
  `informations` TEXT NULL DEFAULT NULL ,
  `author` INT(11) NULL DEFAULT NULL ,
  `creation` DATE NULL DEFAULT NULL ,
  `subcategory` INT(11) NOT NULL ,
  PRIMARY KEY (`id_article`, `author`, `subcategory`) ,
  INDEX `fk_t_articles_t_administrators` (`author` ASC) ,
  INDEX `fk_t_articles_t_sub_categories1` (`subcategory` ASC) ,
  CONSTRAINT `fk_t_articles_t_administrators`
    FOREIGN KEY (`author` )
    REFERENCES `shop_online`.`t_administrators` (`id_administrator` )
    ON DELETE SET NULL
    ON UPDATE CASCADE,
  CONSTRAINT `fk_t_articles_t_sub_categories1`
    FOREIGN KEY (`subcategory` )
    REFERENCES `shop_online`.`t_sub_categories` (`id_sub_category` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;



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

CREATE  TABLE IF NOT EXISTS `shop_online`.`t_administrators` (

id_administrator INT(11) NOT NULL AUTO_INCREMENT ,

name VARCHAR(45) NULL DEFAULT NULL ,

email VARCHAR(326) NULL DEFAULT NULL ,

login VARCHAR(45) NULL DEFAULT NULL ,

password VARCHAR(256) NULL DEFAULT NULL ,

last_connection DATE NULL DEFAULT NULL ,

PRIMARY KEY (id_administrator) )

ENGINE = InnoDB

DEFAULT CHARACTER SET = latin1

COLLATE = latin1_swedish_ci;

Was it helpful?

Solution

You've got author as part of your primary key, which means it's not nullable, but you've got ON DELETE SET NULL on the foreign key constraint on that field. These two conditions are incompatible.

To fix it, remove author from your PRIMARY KEY declaration; your id_newsletter field is already an auto_increment so should be unique unless your application sets it specifically (in which case you shouldn't use auto_increment).

It's a good idea to verify that the referenced field is indexed and has a compatible data type too; I can't see that from the provided information, but it's a good thing to add to your "errno 150 checklist" :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top