2017-04-19 67 views
0

因此,我是非常新的 MySQL,但我想我認爲我抓住了一個相當不錯的一點。我正在努力創建表PROJECT。在我自己的研究之後,我幾乎樂觀地認爲它與我桌子上的鑰匙有關。但我不明白問題出在哪裏或如何解決。MySQL工作臺錯誤1005不能創建表

下面的SQL查詢創建項目的所有表。我不確定這個問題,因爲我現在只能得到該項目的錯誤代碼。任何關於什麼原因以及如何在代碼中糾正這些問題的見解和建議將不勝感激。

CREATE TABLE IF NOT EXISTS `ebrasi1db`.`employee` (
    `ssn` VARCHAR(10) NOT NULL, 
    `fname` VARCHAR(45) NULL DEFAULT NULL, 
    `minit` VARCHAR(1) NULL DEFAULT NULL, 
    `lname` VARCHAR(45) NULL DEFAULT NULL, 
    `bdate` DATE NULL DEFAULT NULL, 
    `address` VARCHAR(45) NULL DEFAULT NULL, 
    `sex` VARCHAR(1) NULL DEFAULT NULL, 
    `salary` INT(11) NULL DEFAULT NULL, 
    `superssn` VARCHAR(10) NULL DEFAULT NULL, 
    `dno` INT(11) NULL DEFAULT NULL, 
    PRIMARY KEY (`ssn`), 
    INDEX `superssn_idx` (`superssn` ASC), 
    INDEX `dno_idx` (`dno` ASC), 
    CONSTRAINT `superssn` 
    FOREIGN KEY (`superssn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `dno` 
    FOREIGN KEY (`dno`) 
    REFERENCES `ebrasi1db`.`department` (`dnumber`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `ebrasi1db`.`department` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ebrasi1db`.`department` (
    `dnumber` INT(11) NOT NULL, 
    `dname` VARCHAR(45) NULL DEFAULT NULL, 
    `mgrssn` VARCHAR(10) NULL DEFAULT NULL, 
    `mgrstartdate` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`dnumber`), 
    INDEX `mgrssn_idx` (`mgrssn` ASC), 
    CONSTRAINT `mgrssn` 
    FOREIGN KEY (`mgrssn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `ebrasi1db`.`dept_locations` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ebrasi1db`.`dept_locations` (
    `dnumber` INT(11) NOT NULL, 
    `dlocation` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`dnumber`, `dlocation`), 
    CONSTRAINT `dnumber` 
    FOREIGN KEY (`dnumber`) 
    REFERENCES `ebrasi1db`.`department` (`dnumber`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `ebrasi1db`.`project` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ebrasi1db`.`project` (
    `pnumber` INT(11) NOT NULL, 
    `pname` VARCHAR(45) NULL, 
    `plocation` VARCHAR(45) NULL, 
    `dnum` INT(11) NOT NULL, 
    PRIMARY KEY (`pnumber`), 
    INDEX `dnum_idx` (`dnum` ASC), 
    INDEX `plocation_idx` (`plocation` ASC), 
    CONSTRAINT `dnum` 
    FOREIGN KEY (`dnum`) 
    REFERENCES `ebrasi1db`.`department` (`dnumber`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `plocation` 
    FOREIGN KEY (`plocation`) 
    REFERENCES `ebrasi1db`.`dept_locations` (`dlocation`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `ebrasi1db`.`works_on` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ebrasi1db`.`works_on` (
    `essn` VARCHAR(10) NOT NULL, 
    `pno` INT NOT NULL, 
    `hours` DECIMAL(5,2) NULL, 
    PRIMARY KEY (`essn`, `pno`), 
    INDEX `pno_idx` (`pno` ASC), 
    CONSTRAINT `works_on_essn` 
    FOREIGN KEY (`essn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `pno` 
    FOREIGN KEY (`pno`) 
    REFERENCES `ebrasi1db`.`project` (`pnumber`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `ebrasi1db`.`dependent` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ebrasi1db`.`dependent` (
    `essn` VARCHAR(10) NOT NULL, 
    `dependent_name` VARCHAR(45) NOT NULL, 
    `sex` VARCHAR(1) NULL, 
    `bdate` DATE NULL, 
    `relation` VARCHAR(45) NULL, 
    PRIMARY KEY (`essn`, `dependent_name`), 
    CONSTRAINT `dependent_essn` 
    FOREIGN KEY (`essn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

你是按照它在這裏的順序運行這個腳本嗎? –

+0

你能分享你提到的錯誤代碼嗎? – PdC

回答

0

你的問題主要在於你試圖創建一個非鍵列的約束(因爲被引用的表有一個雙鍵)。

在你的桌子project您有:

CONSTRAINT `plocation` 
FOREIGN KEY (`plocation`) 
REFERENCES `dept_locations` (`dlocation`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION 

dept_locations.dlocation並不是唯一一個鍵(主鍵),因此你無法創建約束的原因。

你需要作出約束從被引用的表像這樣兩個鍵:

CONSTRAINT `plocation` 
FOREIGN KEY (`pnumber`, `plocation`) 
REFERENCES `dept_locations` (`dnumber`, `dlocation`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION 

在這種情況下你不需要的第一個約束dnum,因爲它是在dept_locations表中已經引用。

另外請注意,你的表departmentemployee不會被創建,因爲一個參考其他的,所以你需要先創建表,而不限制再申請類似的約束:

ALTER TABLE `employee` add 
CONSTRAINT `dno` 
FOREIGN KEY (`dno`) 
REFERENCES `department` (`dnumber`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

相同的department表並且它的約束爲employee

+0

這是一個非常有用的答案。真的幫助我瞭解如何調整我正在做的事情。對於一個如此新的人來說,這讓我知道問題出在哪裏,但並不知道如何解決問題。謝謝! – DailyDoseOf

0

正常情況下,如果無法創建外鍵,您將收到錯誤1005。在創建外鍵約束時,父表應在數據庫中可用。

在您的案例中,'員工'表具有'部門'表的FK,但您在創建'部門'表之前嘗試創建'員工'表。此外,'部門'表中有一個FK返回'員工'表。因此,您無法首先創建「部門」表。爲了解決這個問題,你可以首先創建'部門'表,而不用FK到'員工'表。然後創建'員工'表,然後用FK修改'部門'表。

這是前兩個表的修改後的代碼,如果出現相同的錯誤,請按照相同的模式休息。

CREATE TABLE IF NOT EXISTS `ebrasi1db`.`department` (
`dnumber` INT(11) NOT NULL, 
    `dname` VARCHAR(45) NULL DEFAULT NULL, 
    `mgrssn` VARCHAR(10) NULL DEFAULT NULL, 
    `mgrstartdate` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`dnumber`), 
    INDEX `mgrssn_idx` (`mgrssn` ASC)) 
ENGINE = InnoDB; 

CREATE TABLE IF NOT EXISTS `ebrasi1db`.`employee` (
    `ssn` VARCHAR(10) NOT NULL, 
    `fname` VARCHAR(45) NULL DEFAULT NULL, 
    `minit` VARCHAR(1) NULL DEFAULT NULL, 
    `lname` VARCHAR(45) NULL DEFAULT NULL, 
    `bdate` DATE NULL DEFAULT NULL, 
    `address` VARCHAR(45) NULL DEFAULT NULL, 
    `sex` VARCHAR(1) NULL DEFAULT NULL, 
    `salary` INT(11) NULL DEFAULT NULL, 
    `superssn` VARCHAR(10) NULL DEFAULT NULL, 
    `dno` INT(11) NULL DEFAULT NULL, 
    PRIMARY KEY (`ssn`), 
    INDEX `superssn_idx` (`superssn` ASC), 
    INDEX `dno_idx` (`dno` ASC), 
    CONSTRAINT `superssn` 
    FOREIGN KEY (`superssn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `dno` 
    FOREIGN KEY (`dno`) 
    REFERENCES `ebrasi1db`.`department` (`dnumber`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 


alter table department add 
    CONSTRAINT `mgrssn` 
    FOREIGN KEY (`mgrssn`) 
    REFERENCES `ebrasi1db`.`employee` (`ssn`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 
相關問題