2013-09-16 1 views
2

저는 서로 매우 의존적 인 26 개의 테이블을 가지고 있습니다. 필자는 각 테이블을 작성한 다음 MySQL Workbench을 통해 데이터베이스에서 실행했습니다. 그런 다음 외부 키를 만드는 테이블을 링크 한 모델을 작성합니다. 메타 데이터로 다시 내보냈는데 이제는 응용 프로그램에서 만든 적절한 외부 데이터가 포함 된 테이블의 전체 코드가 있으므로 실수하지 않았습니다.MySQL이 외래 키를 허용하지 않는 이유는 무엇입니까?

그러나 phpMyAdmin에서 실행하는 서버에 파일을 넣을 때 위치를 지정하지 않은 150 오류가 발생합니다. 나는 그것을 봤지만 각각의 경우는 다르며 FK가 자동으로 증가하는 필드가 아니라 UT라는 문자열 필드에 행을 만들었을 때 시간 단위가 있다는 것을 알게되었습니다. (답변 후) 일

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`aplicativo` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `nome` VARCHAR(99) NOT NULL , 
    `ver` VARCHAR(20) NULL DEFAULT NULL , 
    `descr` VARCHAR(254) NULL DEFAULT NULL , 
    `tag` VARCHAR(254) NULL DEFAULT NULL , 
    `url` VARCHAR(254) NULL DEFAULT NULL , 
    `cad` VARCHAR(20) NULL DEFAULT NULL , 
    `obj` TEXT NULL DEFAULT NULL , 
    `tab` VARCHAR(254) NULL DEFAULT NULL , 
    `dbn` VARCHAR(254) NULL DEFAULT NULL , 
    `dbu` VARCHAR(254) NULL DEFAULT NULL , 
    `dbs` VARCHAR(254) NULL DEFAULT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `nome` (`nome` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `app` VARCHAR(20) NULL DEFAULT NULL , 
    `lic` VARCHAR(20) NULL DEFAULT NULL , 
    `tipo` VARCHAR(20) NULL DEFAULT NULL , 
    `nome` VARCHAR(99) NOT NULL , 
    `classe` VARCHAR(99) NOT NULL , 
    `obj` TEXT NULL DEFAULT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `app` VARCHAR(20) NOT NULL , 
    `modulo` VARCHAR(20) NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_modulo_app_modulo1` (`modulo` ASC) , 
    INDEX `fk_modulo_app_aplicativo1` (`app` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) , 
    CONSTRAINT `fk_modulo_app_modulo1` 
    FOREIGN KEY (`modulo`) 
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_modulo_app_aplicativo1` 
    FOREIGN KEY (`app`) 
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

표 :

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' UNIQUE NOT NULL , 
    `app` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL , 
    `modulo` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_modulo_app_modulo1` (`modulo` ASC) , 
    INDEX `fk_modulo_app_aplicativo1` (`app` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) , 
    CONSTRAINT `fk_modulo_app_modulo1` 
    FOREIGN KEY (`modulo`) 
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_modulo_app_aplicativo1` 
    FOREIGN KEY (`app`) 
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

답변

4

당신은 외래 키가 아닌 인덱스 필드를 참조 할 수 없기 때문에, 외부 키 전에 CREATE INDEX 절을 이동해야합니다.

+0

테이블 생성 또는 인덱스 선언 내에서 인덱스 생성 후에 FK 선언을 어떻게 넣을 까? – PSyLoCKe

+0

나는 당신이 말한 방식대로 시도해 보았지만 질문에서 코드를 업데이트했지만, 여전히 150 오류 코드를 얻는다. – PSyLoCKe

2

짧은 이야기는 외래 키가 후보 키 열을 참조해야한다는 것입니다. 즉,이 중

  • 기본 키를 선언 열 또는
  • null가 아닌 독특한를 참조해야한다.

고유하지 않은 열을 참조하면 표준 SQL dbms가 오류를 발생시킵니다. MySQL도 역시 그렇게해야하지만 그렇게하지는 않을 것입니다.

Mysql Docs

을 말한다. . . 시스템은 참조 된 열 이 UNIQUE이거나 NOT NULL로 선언되어야한다는 요구 사항을 시행하지 않습니다. 외래 키 또는 NULL 값을 포함하는 키에 대한 참조는 UPDATE 또는 DELETE CASCADE와 같은 작업에 대해 잘 정의 된 이 아닙니다. 은 UNIQUE ( PRIMARY 포함) 및 NULL이 아닌 키만 참조하는 외래 키를 사용하도록 권장됩니다.

다른 테이블의 고유하지 않은 데이터가 필요한 경우 쿼리에서 조인하거나 뷰에 조인하십시오.

+0

외래 키에 대한 주 인덱스는 UT입니다. – PSyLoCKe

+0

[MySQL의 문서] (http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html)에서 "시스템이 참조 된 열이 UNIQUE이거나 고유하지 않은 키 또는 NULL 값을 포함하는 키에 대한 외래 키 참조 처리는 UPDATE 또는 DELETE CASCADE와 같은 작업에 대해서는 잘 정의되어 있지 않습니다. 고유 (PRIMARY 포함) 및 참조 외의 외래 키를 사용하는 것이 좋습니다 NULL 키. " –

+0

나는 당신이 말한 방식대로 시도해 보았고 질문에서 코드를 업데이트했지만, 여전히 150 오류 코드를 얻는다. – PSyLoCKe