2013-06-24 1 views
0

내가 두 테이블, 활동 및 캠페인 (예, 그것은 일종의하는 내부 사용자 정의 CRM 응용 프로그램입니다)이 : 세 번째 다 대다 테이블 사이MySQL의 여러 화합물 외래 키

create table `tb_activities` (
`organization_id` integer(20) unsigned not null default '0', 
`activity_id` integer(20) unsigned not null auto_increment, 
primary key (`activity_id`) 
) engine=innodb default charset=utf8 pack_keys=1 row_format=compact; 

create table `tb_campaigns` (
`organization_id` integer(20) unsigned not null default '0', 
`campaign_id` integer(20) unsigned not null auto_increment, 
primary key (`campaign_id`) 
) engine=innodb default charset=utf8 pack_keys=1 row_format=compact; 

와의를 두 테이블 모두에 외래 키가 있습니다.

drop table if exists `tb_campaigns_activities`; 
create table `tb_campaigns_activities` (
`organization_id` integer(20) unsigned not null default '0', 
`campaign_id` integer(20) unsigned not null default '0', 
`activity_id` integer(20) unsigned not null default '0', 
primary key (`organization_id`,`campaign_id`,`activity_id`), 
foreign key `rc_campaigns_activities_a` (`organization_id`,`campaign_id`) 
    references `tb_campaigns` (`organization_id`,`campaign_id`) 
    on update restrict on delete restrict, 
foreign key `rc_campaigns_activities_b` (`organization_id`,`activity_id`) 
    references `tb_activities` (`organization_id`,`activity_id`) 
    on update restrict on delete restrict, 
key `dc_campaigns_activities_a` (`organization_id`,`campaign_id`), 
key `dc_campaigns_activities_b` (`organization_id`,`activity_id`) 
) engine=innodb default charset=utf8 pack_keys=1 row_format=compact; 

하지만 설치하려고하면 105 개의 mysql 오류가 발생합니다. 지금까지이 오류를 조사한 결과 나쁜 형식의 외래 키가 있다는 것을 알았습니다. 작동하도록 한 유일한 방법은 dc_campaigns_activities_a 및 dc_campaigns_activities_b 관계를 모두 제거하는 것입니다. 그래서 데이터베이스는 논리적 오류에 대해 불평하지만, 나는 미쳤다. 나에게는 완벽한 외래 키 시나리오입니다. organization_id가 두 키에 의해 공유되는 유일한 것입니다. 왜 이것이 맞지 않습니까?

답변

2

참조 된 테이블에 외래 키인 외래 키만 추가 할 수 있습니다. (organization_id,campaign_id)tb_campaigns의 키가 아닙니다 (활동과 동일). 열 유형도 일치해야하지만 일치해야합니다.

+0

예, 추가 연구에 따르면 tb_activities 및 ('organization_id','activity_id')에 고유 키 ('organization_id','campaign_id')가 있어야합니다. 폭발 감사합니다! –