2015-11-22 4 views
1
ERROR: Error 1005: Can't create table 'db.pics' (errno: 150) 
SQL Code: 
     CREATE TABLE IF NOT EXISTS `db`.`pics` (
      `pic_id` INT NOT NULL COMMENT '', 
      PRIMARY KEY (`pic_id`) COMMENT '', 
      CONSTRAINT `fk_pics_houses1` 
      FOREIGN KEY (`pic_id`) 
      REFERENCES `db`.`houses` (`pic_id`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
     ENGINE = InnoDB 

Я удостоверился, что значения совпадают с внешним ключом (pic_id) и основным ключом в моей таблице домов. Я также создал индексы. Так что я действительно не знаю, где эта ошибка. Если кто-то может предоставить какие-либо другие объяснения, почему происходит ошибка 1005, это было бы очень полезно. Спасибо.Ошибка 1005: не удается создать таблицу (errno 150)

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

CREATE SCHEMA IF NOT EXISTS `db` DEFAULT CHARACTER SET latin1 ; 
USE `db` ; 

DROP TABLE IF EXISTS `db`.`users` ; 

CREATE TABLE IF NOT EXISTS `db`.`users` (
    `user_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '', 
    PRIMARY KEY (`user_id`) COMMENT '', 
ENGINE = InnoDB 
AUTO_INCREMENT = 24 
DEFAULT CHARACTER SET = latin1; 

DROP TABLE IF EXISTS `db`.`houses` ; 

CREATE TABLE IF NOT EXISTS `db`.`houses` (
    `house_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '', 
    `user_id` INT(11) NOT NULL COMMENT '', 
    `pic_id` INT(11) NOT NULL COMMENT '', 
    PRIMARY KEY (`house_id`) COMMENT '', 
    CONSTRAINT `fk_houses_users1` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `db`.`users` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
AUTO_INCREMENT = 25 
DEFAULT CHARACTER SET = latin1; 

CREATE INDEX `fk_houses_users1_idx` ON `db`.`houses` (`user_id` ASC) COMMENT ''; 

DROP TABLE IF EXISTS `db`.`pics` ; 

CREATE TABLE IF NOT EXISTS `db`.`pics` (
    `pic_id` INT NOT NULL COMMENT '', 
    PRIMARY KEY (`pic_id`) COMMENT '', 
    CONSTRAINT `fk_pics_houses1` 
    FOREIGN KEY (`pic_id`) 
    REFERENCES `db`.`houses` (`pic_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

ответ

1

Я только что создал индекс fk_houses_pics_idx и он работает. Вот обновленный код:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

CREATE SCHEMA IF NOT EXISTS `db` DEFAULT CHARACTER SET latin1 ; 
USE `db` ; 

DROP TABLE IF EXISTS `db`.`users` ; 

CREATE TABLE IF NOT EXISTS `db`.`users` (
    `user_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '', 
    PRIMARY KEY (`user_id`) COMMENT '' 
) 
ENGINE = InnoDB 
AUTO_INCREMENT = 24 
DEFAULT CHARACTER SET = latin1; 

DROP TABLE IF EXISTS `db`.`houses` ; 

CREATE TABLE IF NOT EXISTS `db`.`houses` (
    `house_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '', 
    `user_id` INT(11) NOT NULL COMMENT '', 
    `pic_id` INT(11) NOT NULL COMMENT '', 
    PRIMARY KEY (`house_id`) COMMENT '', 
    CONSTRAINT `fk_houses_users1` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `db`.`users` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
AUTO_INCREMENT = 25 
DEFAULT CHARACTER SET = latin1; 

CREATE INDEX `fk_houses_users1_idx` ON `db`.`houses` (`user_id` ASC) COMMENT ''; 
CREATE INDEX `fk_houses_pics_idx` ON `db`.`houses` (`pic_id` ASC) COMMENT ''; /*This is what I just added */ 

DROP TABLE IF EXISTS `db`.`pics` ; 

CREATE TABLE IF NOT EXISTS `db`.`pics` (
    `pic_id` INT NOT NULL COMMENT '', 
    PRIMARY KEY (`pic_id`) COMMENT '', 
    CONSTRAINT `fk_pics_houses1` 
    FOREIGN KEY (`pic_id`) 
    REFERENCES `db`.`houses` (`pic_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Так почему же это сработало? При создании ограничения внешнего ключа MySQL требует использования полезного индекса как для таблицы ссылок, так и для ссылочной таблицы. Индекс в таблице ссылок создается автоматически, если он не существует, но тот, который указан в таблице, должен быть создан вручную (Source). Ваш, кажется, отсутствует.

Похоже, вам не хватало указателя для pic_id на столе houses. Добавление его решило проблему.