msql双主键,创建双外键遇到问题解决

来源:互联网 发布:网络销售茶叶好做吗 编辑:程序博客网 时间:2024/06/10 21:18

今天用mysql创建表遇到一个问题:ERROR1005:can't create table xxxx.pcorelation error:150

我的表如下:

create table commodityinfo
(
  tracecode varchar(50) not null check(tracecode!=''),
  securitycode varchar(50) not null,
  companyid varchar(50)  not null,
  sortcode varchar(50) not null,
   primary key(tracecode,companyid)
)engine=innodb default charset=utf8;

create table pakageinfo
(
  pid int(32) not null,
  xxxxx
  primary key(pid)
)engine=innodb default charset=utf8;

create table tracecodepackagerelation
(
  tracecode varchar(50) not null check(tracecode!=''),
  pid int(32) not null,
  xxxxx

 .......
  primary key(tracecode,pid),
  foreign key(tracecode) references commodityinfo(tracecode) on delete cascade on update cascade,
  foreign key(pid) references pakageinfo(pid) on delete cascade on update cascade
)engine=innodb default charset=utf8;


create table sortinfo
(
  oid int(32) not null,
  xxxxx.....
  primary key(oid)
)engine=innodb default charset=utf8;

create table pcorelation
(
  pid int(32) not null,
  oid int(32) not null,
  companyid varchar(50)  not null,
  primary key(companyid,pid),
  foreign key(companyid) references commodityinfo(companyid) on delete cascade on update cascade,
  foreign key(pid) references pakageinfo(pid) on delete cascade on update cascade,
  foreign key(oid) references pakageinfo(oid) on delete cascade on update cascade
)engine=innodb default charset=utf8;

一直在网上也差不多解决方案,自己调试的时候发现 foreign key(tracecode) references commodityinfo(tracecode) on delete cascade on update cascade是可以的,

 而foreign key(companyid) references commodityinfo(companyid) on delete cascade on update cascade却不行,于是我改变一下

primary key(tracecode,companyid)中顺序->primary key(companyid,tracecode),这样原来可以的 foreign key(tracecode)却报错了,二原来不行的foreign key(companyid) 却可以了,于是我猜测primary key(tracecode,companyid)的时候是以第一个字段作为主要索引的,这样我在第一个表中多创建一个处于第二个字段companyid的索引,index(companyid),再试一次,这个时候其实我已经快崩溃了。于是突然!okey啦!创建完成!无比happy!

0 0