2012-12-31 4 views
1

나는 # 150 오류가 있습니다.
다른 포럼을 찾고 있었지만 외래 키에 대해 동일한 유형이 있어야합니다.MYSQL, error 150

USE `dbask`; 
set names utf8; 

/*users*/ 
CREATE TABLE IF NOT EXISTS `users` (
    `id`    INT NOT NULL AUTO_INCREMENT, 
    `username`   VARCHAR(30) NOT NULL, 
    `password`   VARCHAR(255) NOT NULL, 
    `permission`  VARCHAR(10) NULL, 
    `firstname`   VARCHAR(40) NULL, 
    `lastname`   VARCHAR(40) NULL, 
    `birthdate`   VARCHAR(255) NULL, 
    `picture_link`  VARCHAR(255) NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 


/*questions*/ 
CREATE TABLE IF NOT EXISTS `questions` (
    `id`    INT NOT NULL AUTO_INCREMENT, 
    `username`   VARCHAR(30) NOT NULL, 
    `asked_username` VARCHAR(30) NULL, 
    `question`   VARCHAR(255) NOT NULL, 
    `answer`   VARCHAR(255) NULL, 
    `time_asked`  VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_questions_to_users` 
     FOREIGN KEY (`username`) 
     REFERENCES `users`(`username`) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
    ) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

두 가지 유형이 VARCHAR(30) 그래서 난 문제가 무엇인지 알 수 있습니다

그리고 여기 내 코드입니다.

+2

사용자 이름 대신 사용자 ID를 참조하지 않는 이유가 있습니까? –

+0

쿠키로 인코딩 된 사용자 이름으로 저장하므로 DB에 대한 쿼리가 적을 것이라고 생각했습니다. – Ivan

+2

귀하의 가정이 잘못되었다고 생각합니다. int 인덱스는 mysql에서 사용할 수있는 가장 빠른 인덱스이다. 사용자 이름은 정확하게 "변경 불가능한"값이 아니며 ID보다 더 자주 변경할 수 있습니다. – Xnoise

답변

1

당신은 표는 다음 질문 테이블에 FOREIGN KEY를 만들 수 있습니다 이름같은 PRIMARY KEY에서 사용자 생성해야합니다. 또는 당신은 SQL 표준에서

편차 아래와 같이 UNIQUE KEYFOREIGN KEY을 만드는 데 사용할 수 있습니다 비 UNIQUE 키를 참조하는 FOREIGN KEY 제약 조건이 표준 SQL이 아니다. 이것은 표준 SQL에 대한 InnoDB 확장이다. SQL 표준에서

USE `dbask`; 
SET NAMES utf8; 

/*users*/ 
CREATE TABLE IF NOT EXISTS `users` (
    `id`    INT NOT NULL AUTO_INCREMENT, 
    `username`   VARCHAR(30) NOT NULL, 
    `password`   VARCHAR(255) NOT NULL, 
    `permission`  VARCHAR(10) NULL, 
    `firstname`   VARCHAR(40) NULL, 
    `lastname`   VARCHAR(40) NULL, 
    `birthdate`   VARCHAR(255) NULL, 
    `picture_link`  VARCHAR(255) NULL, 
    PRIMARY KEY (`id`), UNIQUE KEY (username)) 
ENGINE = INNODB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 


/*questions*/ 
CREATE TABLE IF NOT EXISTS `questions` (
    `id`    INT NOT NULL AUTO_INCREMENT, 
    `username`   VARCHAR(30) NOT NULL, 
    `asked_username` VARCHAR(30) NULL, 
    `question`   VARCHAR(255) NOT NULL, 
    `answer`   VARCHAR(255) NULL, 
    `time_asked`  VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `fk_questions_to_users` 
     FOREIGN KEY (`username`) 
     REFERENCES `users`(`username`) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
    ) 
ENGINE = INNODB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

+0

그래서 기본 키가 아닌 참조 할 수 없습니까 ?? – Ivan

+0

비 기본 키 열을 참조 할 수 없습니다. –

+0

사용자 테이블의 사용자 이름에 고유 키를 저장해야합니다. –

0

My SQL Documentation

편차 : 비 UNIQUE 키를 참조하는 FOREIGN KEY 제약 조건은 표준 SQL이 아니다. 이것은 표준 SQL에 대한 InnoDB 확장이다.