2013-11-15 102 views
0

我正在與MySQL的錯誤,我不明白爲什麼:#1005 - 無法創建表 'feedback.answer'(錯誤: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 `feedback` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `feedback` ; 

-- ----------------------------------------------------- 
-- Table `feedback`.`application` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`application` (
    `application_id` INT NOT NULL AUTO_INCREMENT, 
    `app_name` VARCHAR(45) NULL, 
    PRIMARY KEY (`application_id`), 
    UNIQUE INDEX `app_name_UNIQUE` (`app_name` ASC)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`user` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`user` (
    `user_id` INT NOT NULL AUTO_INCREMENT, 
    `firstname` VARCHAR(45) NOT NULL, 
    `lastname` VARCHAR(45) NULL, 
    `email` VARCHAR(45) NOT NULL, 
    `customer_length` VARCHAR(45) NULL, 
    PRIMARY KEY (`user_id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`users_has_application` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`users_has_application` (
    `user_id` INT NOT NULL, 
    `application_id` INT NOT NULL, 
    PRIMARY KEY (`user_id`, `application_id`), 
    INDEX `fk_users_has_application_application1_idx` (`application_id` ASC), 
    INDEX `fk_users_has_application_users_idx` (`user_id` ASC), 
    CONSTRAINT `fk_users_has_application_users` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `feedback`.`user` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_users_has_application_application1` 
    FOREIGN KEY (`application_id`) 
    REFERENCES `feedback`.`application` (`application_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`survey` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`survey` (
    `survey_id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(45) NULL, 
    `description` VARCHAR(255) NULL, 
    `is_active` TINYINT(1) NULL, 
    PRIMARY KEY (`survey_id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`question` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`question` (
    `question_id` INT NOT NULL, 
    `question_text` VARCHAR(255) NULL, 
    PRIMARY KEY (`question_id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`option` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`option` (
    `option_id` INT NOT NULL AUTO_INCREMENT, 
    `question_id` INT NOT NULL, 
    `option_number` INT NOT NULL, 
    `option_text` TEXT NULL, 
    INDEX `fk_option_question1_idx` (`question_id` ASC), 
    PRIMARY KEY (`option_id`), 
    UNIQUE INDEX `uk_question_option_number_key` (`question_id` ASC, `option_number` ASC), 
    CONSTRAINT `fk_option_question1` 
    FOREIGN KEY (`question_id`) 
    REFERENCES `feedback`.`question` (`question_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`answer` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`answer` (
    `answer_id` INT NOT NULL AUTO_INCREMENT, 
    `user_id` INT NOT NULL, 
    `option_id` INT NOT NULL, 
    `date_submitted` DATETIME NOT NULL, 
    PRIMARY KEY (`answer_id`), 
    INDEX `fk_answer_user1_idx` (`user_id` ASC), 
    INDEX `fk_answer_option1_idx` (`option_id` ASC), 
    CONSTRAINT `fk_answer_user1` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `feedback`.`user` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_answer_option1` 
    FOREIGN KEY (`option_id`) 
    REFERENCES `feedback`.`option` (`option_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `feedback`.`survey_has_question` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `feedback`.`survey_has_question` (
    `survey_id` INT NOT NULL, 
    `question_id` INT NOT NULL, 
    `question_number` INT NULL, 
    PRIMARY KEY (`survey_id`, `question_id`), 
    INDEX `fk_survey_has_question_question1_idx` (`question_id` ASC), 
    INDEX `fk_survey_has_question_survey1_idx` (`survey_id` ASC), 
    UNIQUE INDEX `unique_order_key` (`survey_id` ASC, `question_number` ASC), 
    CONSTRAINT `fk_survey_has_question_survey1` 
    FOREIGN KEY (`survey_id`) 
    REFERENCES `feedback`.`survey` (`survey_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_survey_has_question_question1` 
    FOREIGN KEY (`question_id`) 
    REFERENCES `feedback`.`question` (`question_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; 

錯誤:

#1005 - Can't create table 'feedback.answer' (errno: 150) 

我從這個創造我的表作爲模板:

https://dba.stackexchange.com/questions/16002/survey-database-design-associate-an-answer-to-a-user/16047#16047

我的思維過程添加answer_i d到答案表是我希望用戶能夠多次填寫相同的調查問卷。

爲什麼答案表會拋出錯誤?

編輯: 服務器版本:5.5.29-0ubuntu0.12.04.2 我導入此使用phpMyAdmin

+0

也許這個問題是有幫助的:http://stackoverflow.com/questions/1457305/mysql-creating-tables-with-foreign-keys-giving-errno-150但我看不到你的任何要求失蹤了。 – Barmar

+0

我在沒有創建反饋數據庫的情況下在sqlfiddle中寫道,它可以工作。我不確定這個問題會出現什麼問題。 –

+0

我也嘗試在sqlfiddle中重新創建,並且不能。也許這與改變默認字符集或整理有關,因爲sqlfiddle不會讓我擺弄這些。 – Barmar

回答

1

你的代碼工作的MYSQL服務器5.1沒有錯誤。

errno:150的常見原因是當您創建引用尚不存在的PK的FK約束時。確保在創建「答案」表之前,先創建「用戶」和「選項」表。

爲了幫助調試,您可以一次刪除一個FK約束,以查看哪個引發問題。

如果按照顯示的順序執行代碼,我看不到會發生任何FK問題。

+0

奇怪。爲什麼它不適合我?我用我的服務器詳細信息更新了問題。我仍然開始調試過程,看看問題是什麼。 – joshmmo

0

試試這個

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

-- ----------------------------------------------------- 
-- Table `feedback`.`application` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `application` (
`application_id` INT NOT NULL AUTO_INCREMENT, 
`app_name` VARCHAR(45) NULL, 
PRIMARY KEY (`application_id`), 
UNIQUE INDEX `app_name_UNIQUE` (`app_name` ASC)) 
; 

your working code in fiddle

+0

至少,在你的答案中放一些代碼。 – Kermit

+0

@FreshPrinceOfSO完成你說的船長先生:) –

+0

仍然同樣的錯誤使用MySQL 5.5.29#1005 - 無法創建表'feedback.answer'(錯誤:150) – joshmmo

相關問題