2012-10-11 71 views
0

我正在嘗試使用此腳本創建數據庫。但我在黑洞。我不知道現在該做什麼。這是我的MySQL代碼。請有人踢我。創建MySQL的更多外鍵

如果我使用一個外鍵就沒問題,但我不知道如何使用更多的外鍵。

EROOR爲:

#1005 - Can't create table 'ruda_dev_souteze2.results' (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 `ruda_dev_souteze2` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci ; 

USE `ruda_dev_souteze2` ; 

-- ----------------------------------------------------- 
-- Table `ruda_dev_souteze2`.`contests` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`contests` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `date` DATE NOT NULL , 
    `public` TINYINT(1) NOT NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 11 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 


-- ----------------------------------------------------- 
-- Table `ruda_dev_souteze2`.`people` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`people` (
    `contest_id` BIGINT(20) NOT NULL , 
    `number` INT(11) NOT NULL , 
    `category` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `fname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `lname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    PRIMARY KEY (`contest_id`, `number`) , 
    INDEX `id_idx` (`contest_id` ASC) , 
    CONSTRAINT `cidfp` 
    FOREIGN KEY (`contest_id`) 
    REFERENCES `ruda_dev_souteze2`.`contests` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 


-- ----------------------------------------------------- 
-- Table `ruda_dev_souteze2`.`subjects` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`subjects` (
    `contest_id` BIGINT(20) NOT NULL , 
    `number` INT(11) NOT NULL , 
    `name` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `direct` TINYINT(1) NOT NULL , 
    `type` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `subjectscol` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NULL DEFAULT NULL , 
    PRIMARY KEY (`contest_id`, `number`) , 
    INDEX `id_idx` (`contest_id` ASC) , 
    CONSTRAINT `cidfs` 
    FOREIGN KEY (`contest_id`) 
    REFERENCES `ruda_dev_souteze2`.`contests` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 


-- ----------------------------------------------------- 
-- Table `ruda_dev_souteze2`.`results` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
    `contest_id` BIGINT(20) NOT NULL , 
    `subject_number` INT(11) NOT NULL , 
    `people_number` INT(11) NOT NULL , 
    `number_8c2` FLOAT(10,2) NULL DEFAULT NULL , 
    `time_time` TIME NULL DEFAULT NULL , 
    `time_frag` FLOAT(2,2) NULL DEFAULT NULL , 
    PRIMARY KEY (`contest_id`, `subject_number`, `people_number`) , 
    INDEX `cidfr_idx` (`contest_id` ASC) , 
    INDEX `snfr_idx` (`subject_number` ASC) , 
    INDEX `pnfr_idx` (`people_number` ASC) , 
    CONSTRAINT `cidfr` 
    FOREIGN KEY (`contest_id`) 
    REFERENCES `ruda_dev_souteze2`.`contests` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `snfr` 
    FOREIGN KEY (`subject_number`) 
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `pnfr` 
    FOREIGN KEY (`people_number`) 
    REFERENCES `ruda_dev_souteze2`.`people` (`number`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 


-- ----------------------------------------------------- 
-- Table `ruda_dev_souteze2`.`users` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`users` (
    `username` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `fullname` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    `password` BINARY(40) NOT NULL , 
    `access` CHAR(1) CHARACTER SET 'utf8' COLLATE 'utf8_czech_ci' NOT NULL , 
    PRIMARY KEY (`username`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 



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

您是否收到錯誤(如果是這樣,它是什麼)?你想要第二個/附加的外鍵在哪個表/列上?我不是70%確定我明白你需要幫助。 – newfurniturey

+0

對不起,你的問題是什麼?你在你的SQL中定義了幾個不同的FOREIGN KEY,你是否會出現某種錯誤? –

+0

編輯。我得到錯誤 –

回答

1

我想我明白你的要求(如果不是,請說明)。

在你CREATE TABLE查詢的results表,你想創建三個獨立FOREIGN KEY列和每去一個不同的表。在查詢的問題是這三行:

INDEX `cidfr_idx` (`contest_id` ASC) , 
INDEX `snfr_idx` (`subject_number` ASC) , 
INDEX `pnfr_idx` (`people_number` ASC) , 

如果更改INDEXKEY它應該工作的罰款。此外,ASC是默認的 - 所以在技術上,你可以離開它(但把它留在不會傷害的事情

所以,這個小更新後的results表你CREATE TABLE應該是這樣的:

CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
    `contest_id` BIGINT(20) NOT NULL , 
    `subject_number` INT(11) NOT NULL , 
    `people_number` INT(11) NOT NULL , 
    `number_8c2` FLOAT(10,2) NULL DEFAULT NULL , 
    `time_time` TIME NULL DEFAULT NULL , 
    `time_frag` FLOAT(2,2) NULL DEFAULT NULL , 
    PRIMARY KEY (`contest_id`, `subject_number`, `people_number`) , 
    KEY `cidfr_idx` (`contest_id`) , 
    KEY `snfr_idx` (`subject_number`) , 
    KEY `pnfr_idx` (`people_number`) , 
    CONSTRAINT `cidfr` 
    FOREIGN KEY (`contest_id`) 
    REFERENCES `ruda_dev_souteze2`.`contests` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `snfr` 
    FOREIGN KEY (`subject_number`) 
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `pnfr` 
    FOREIGN KEY (`people_number`) 
    REFERENCES `ruda_dev_souteze2`.`people` (`number`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_czech_ci; 

我與本地更改測試的完整劇本,並罰款跑 - 請讓我知道如果你有任何問題,我可以看看它進一步

+0

我試過了。我的部分替換了我的部分查詢。我有這個錯誤: #1005 - 無法創建表'ruda_dev_souteze2.results'(errno:150) 我正在通過phpmyadmin做到這一點。 謝謝感興趣, –

1

參考列BIGINT

CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`subjects` (
    `contest_id` BIGINT(20) NOT NULL ,       --- BIGINT 
... 

而引用是INT

CREATE TABLE IF NOT EXISTS `ruda_dev_souteze2`.`results` (
    `contest_id` BIGINT(20) NOT NULL , 
    `subject_number` INT(11) NOT NULL ,       --- INT 
    ... 
    CONSTRAINT `snfr` 
    FOREIGN KEY (`subject_number`) 
    REFERENCES `ruda_dev_souteze2`.`subjects` (`number`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 

他們應該有相同的數據類型。

+0

哦,我有更多的主鍵。競賽(id),人物(contest_id,編號),主題(contest_id,編號),結果(contest_id,people_number,subject_number)。在比賽中是PK AUTOINCREMENT和BIGINT。而在其他人中只有這個col是BIGINT,其他人只有INT。 –