2012-02-27 2 views
0

나는 두 테이블, '포'와 '외부 키를 정의하여 내가 두 테이블을 연결하기 위해 노력하고있어MySQL의 : 오류 메시지가 테이블을 만들 수 없습니다 (errno를 : 150)

CREATE TABLE `po` (
    `PO_ID` bigint(20) NOT NULL, 
    `SERVICE_TYPE` bit(1) DEFAULT NULL, 
    `ENTRY_DATE` date NOT NULL, 
    `RECEIPT_DATE` date DEFAULT NULL, 
    `TURNOVER` date DEFAULT NULL, 
    `MOBILIZATION` date DEFAULT NULL, 
    `SITE_NAME` varchar(255) NOT NULL, 
    `SITE_CODE` varchar(45) DEFAULT NULL, 
    `SITE_TIN` varchar(45) DEFAULT NULL, 
    `SITE_ADDRESS` varchar(255) NOT NULL, 
    `COST` decimal(11,2) NOT NULL, 
    `XML` text, 
    PRIMARY KEY (`PO_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

CREATE TABLE `receive` (
    `RECEIPT_ID` varchar(100) NOT NULL, 
    `RECEIPT_DATE` date NOT NULL, 
    `PO_NUMBER` bigint(20) NOT NULL, 
    `SUPPLIER_ID` int(11) NOT NULL, 
    PRIMARY KEY (`RECEIPT_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

를'받을 '을 가지고

Error Code: 1005. Can't create table 'fourthwave.#sql-aec_11' (errno:150) 

내가 Fi를 때문에이 오류가 점점 오전 : '테이블에'fk_po는

ALTER TABLE `fourthwave`.`receive` 
    ADD CONSTRAINT `fk_po` 
    FOREIGN KEY (`PO_NUMBER`) 
    REFERENCES `fourthwave`.`po` (`PO_ID`) 
    ON DELETE SET NULL 
    ON UPDATE SET NULL 
, ADD INDEX `fk_po` (`PO_NUMBER` ASC) 

그러나, ALTER 쿼리는 위의 오류가 발생합니다 '가 나타납니다 두 테이블의 'PO_ID'및 'PO_NUMBER'이 (가) 서로 다릅니다.

답변

3

ALTER TABLE 후에 SHOW ENGINE INNODB STATUS 문을 실행하면 ' 열 중 일부가 NOT NULL로 정의되었지만 SET NULL 조건을 정의했습니다.'라는 오류 메시지가 표시됩니다.

ALTER TABLE `receive` 
    ADD CONSTRAINT `fk_po` 
    FOREIGN KEY (`PO_NUMBER`) 
    REFERENCES `po` (`PO_ID`) 
    ON DELETE SET NULL 
    ON UPDATE SET NULL 
, ADD INDEX `fk_po` (`PO_NUMBER` ASC); 

SHOW ENGINE INNODB STATUS; 
+0

이것은 효과가 있습니까? 인덱스와 FK 제약 조건을 같은 이름으로 가질 수 있습니까? –

+0

예, 작동합니다. 다른 이름을 붙일 수는 있지만,이 인덱스를 만들지 않으면 MySQL은 같은 이름으로 인덱스를 생성합니다. – Devart

+0

흥미 롭습니다. FK를 추가하고 제약 조건의 이름을 남기면 MySQL은 항상 자동으로 some_table_ibfk_1과 같은 것을 채 웁니다. 이것은 인덱스와 FK에 대한 이름 충돌이 없다는 것을 의미합니다. –

0

receive 테이블에 PO_NUMBER의 색인이 필요합니다. 외래 키에서 참조하는 필드는 항상 인덱싱되어야합니다.