Question

I am working on a database in Workbench but I am stuck on a problem with the foreign key between post and language. I am assuming that that fk triggers this error because when I remove this fk the query runs without any problems. I have checked the type compatibility and made sure the indexes are present. I am missing something here?

The goal of this fk is to reference those both tables on varchar.

SQL that triggers the 150 (InnoDB):

-- MySQL Script generated by MySQL Workbench
-- 04/05/14 22:08:25
-- Model: New Model    Version: 1.0
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';

-- -----------------------------------------------------
-- Schema SBDB_v0.1.2
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `SBDB_v0.1.2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `SBDB_v0.1.2` ;

-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`language`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`language` (
  `id` INT NOT NULL,
  `language` VARCHAR(120) NOT NULL,
  `lang_abr` CHAR(3) NULL,
  PRIMARY KEY (`id`, `language`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`post`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`post` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `language` VARCHAR(120) NOT NULL,
  `thumbnail_name` VARCHAR(255) NOT NULL,
  `id_sk` INT NULL,
  `title` VARCHAR(255) NULL,
  `author` VARCHAR(45) NULL,
  `message` TEXT NULL,
  `date_created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `last_time_modified` TIMESTAMP NULL,
  PRIMARY KEY (`id`),
  INDEX `language_1_idx` (`language` ASC),
  CONSTRAINT `language_1`
    FOREIGN KEY (`language`)
    REFERENCES `SBDB_v0.1.2`.`language` (`language`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`image`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`image` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `language` VARCHAR(255) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `upload_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `language`),
  INDEX `name_1_idx` (`name` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`category`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`category` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `language` VARCHAR(255) NOT NULL,
  `title` VARCHAR(255) NULL,
  `description` VARCHAR(255) NULL,
  `date_created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `language`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`post_category`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`post_category` (
  `id_post` INT NOT NULL,
  `id_category` INT NOT NULL,
  PRIMARY KEY (`id_post`, `id_category`),
  INDEX `id_category_idx` (`id_category` ASC),
  CONSTRAINT `id_post`
    FOREIGN KEY (`id_post`)
    REFERENCES `SBDB_v0.1.2`.`post` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `id_category`
    FOREIGN KEY (`id_category`)
    REFERENCES `SBDB_v0.1.2`.`category` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`page`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`page` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `id_page_pass` INT NULL,
  `title` VARCHAR(255) NULL,
  `content` MEDIUMTEXT NULL,
  `date_created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `last_time_modified` TIMESTAMP NULL,
  PRIMARY KEY (`id`, `id_page_pass`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`page_password`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`page_password` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `password` VARCHAR(255) NOT NULL,
  `date_created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  CONSTRAINT `id_page211`
    FOREIGN KEY (`id`)
    REFERENCES `SBDB_v0.1.2`.`page` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`search_keyword`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`search_keyword` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `language` VARCHAR(255) NOT NULL,
  `keyword` VARCHAR(255) NULL,
  PRIMARY KEY (`id`, `language`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`post_search_keyword`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`post_search_keyword` (
  `id_post` INT NOT NULL,
  `id_sk` INT NOT NULL,
  PRIMARY KEY (`id_post`, `id_sk`),
  INDEX `id_sk_1_idx` (`id_sk` ASC),
  CONSTRAINT `id_post_2`
    FOREIGN KEY (`id_post`)
    REFERENCES `SBDB_v0.1.2`.`post` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `id_sk_1`
    FOREIGN KEY (`id_sk`)
    REFERENCES `SBDB_v0.1.2`.`search_keyword` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `login` VARCHAR(25) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  `firstname` VARCHAR(45) NULL,
  `lastname` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `SBDB_v0.1.2`.`social_media`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`social_media` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `language` VARCHAR(255) NOT NULL,
  `name` VARCHAR(45) NULL,
  `link` VARCHAR(255) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Was it helpful?

Solution

When establishing a FOREIGN KEY relationship, MySQL expects the referenced and referencing column(s) to both be indexed. If it is a single column FOREIGN KEY, there must be a single index on the referenced column.

In this language table, you have defined a compound PRIMARY KEY across (id, language), but there is no individual index on (language) alone.

CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`language` (
  `id` INT NOT NULL,
  `language` VARCHAR(120) NOT NULL,
  `lang_abr` CHAR(3) NULL,
  /* compound key only */
  PRIMARY KEY (`id`, `language`))
ENGINE = InnoDB;

Add another index on just (language) so the referencing column has an index to point to:

CREATE TABLE IF NOT EXISTS `SBDB_v0.1.2`.`language` (
  `id` INT NOT NULL,
  `language` VARCHAR(120) NOT NULL,
  `lang_abr` CHAR(3) NULL,
  PRIMARY KEY (`id`, `language`),
  /* single index on language */
  INDEX (`language`)
) ENGINE = InnoDB;

Here it is working properly with the additional index added.

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