2013-07-07 5 views
0

관심 분야와 제품을 나타내는 두 개의 테이블이 있습니다. 그들 사이에 many_many 관계를 구현 중입니다. 테이블을 만들 때 제품 또는 관심 레코드가 삭제되면 할당 테이블의 레코드가 삭제되도록 테이블 제약 조건을 작성하지 않았습니다.테이블 생성 후 테이블 참조 제약 조건 추가하기 MySQL

관심 표

CREATE TABLE IF NOT EXISTS `interests` (
    `id` int(11) NOT NULL auto_increment, 
    `interest` varchar(255) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=62 ; 

제품 표

CREATE TABLE IF NOT EXISTS `products` (
    `id` int(11) NOT NULL auto_increment, 
    `created` datetime NOT NULL, 
    `modified` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=65 ; 

할당 표

CREATE TABLE IF NOT EXISTS `interest_product_assignment` (
    `id` int(11) NOT NULL auto_increment, 
    `interest_id` int(11) NOT NULL, 
    `product_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `product` (`product_id`), 
    KEY `interest` (`interest_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

내 이 제한 조건을 추가하려는 시도가 실패로 표시됩니다.

ALTER TABLE `interest_product_assignment` ADD CONSTRAINT `product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; 

ALTER TABLE `interest_product_assignment` ADD CONSTRAINT `interest` FOREIGN KEY (`interest_id`) REFERENCES `interest` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; 

제품 레코드를 삭제하면 해당 할당 레코드가 삭제되지 않습니다. 이에

몇 가지 질문 :

  1. 이 제약 이런 종류의 올바른 구문인가?
  2. 테이블을 만들 때 이러한 제약 조건을 추가하지 않았거나 이미 테이블에 데이터가있는 것이 중요합니까?
  3. PHPMyADMIN에서 구속 조건이 성공적으로 추가되었는지 확인할 수 있습니까? PHPMyADMIN이 오류 메시지를 표시하지 않고 내 제약 조건을 무시했다고 생각하게되었습니다.

답변

1

외래 키를 추가해도 MyISAM 테이블에 경고/오류가 발생하지 않지만 지원되지 않습니다.

외래 키를 만들기 전에 MyISAM을 InnoDB로 변경해야 완벽하게 정상적으로 작동합니다. 공식 MySQL의 설명서에서

: 나중 단계에서

는, 외부 키 제한 조건뿐만 아니라 MyISAM 테이블에 대해 구현됩니다

http://dev.mysql.com/doc/refman/5.7/en/ansi-diff-foreign-keys.html

+0

감사합니다, 이것은 매력을했다. – goose