navicat mysql中,引用属性组作为外键,其中一个无法引用

abckangaroo 2010-12-22 01:23:51
引用另一个表中的属性组(主码)作为外键,一个正常,另一个无法添加外键,这是为什么?
这个问题纠结了两天了……为什么为什么为什么?????????


CREATE TABLE `match` (
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`matchGoals` int(11) DEFAULT NULL,
PRIMARY KEY (`matchNO`,`place`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;



CREATE TABLE `join` (
`teamNameJ` varchar(50) NOT NULL,
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`result` varchar(50) DEFAULT NULL,
PRIMARY KEY (`teamNameJ`,`matchNO`,`place`),
KEY `matchNO` (`matchNO`),
KEY `place` (`place`),
CONSTRAINT `matchNO` FOREIGN KEY (`matchNO`) REFERENCES `match` (`matchNO`), //正常
CONSTRAINT `teamNameJ` FOREIGN KEY (`teamNameJ`) REFERENCES `team` (`teamName`),//正常
CONSTRAINT `place` FOREIGN KEY (`place`) REFERENCES `match` (`place`) //place外键无法插入
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
...全文
212 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
acrunner 2012-05-09
  • 打赏
  • 举报
回复
abckangaroo 2010-12-22
  • 打赏
  • 举报
回复
改好了~谢谢各位~

替自己总结下错误原因:
子表的外键必须依赖主表的主键的全部,应为主表的主键建立索引。


CREATE TABLE `join` (
`teamNameJ` varchar(50) NOT NULL,
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`result` varchar(50) DEFAULT NULL,
PRIMARY KEY (`teamNameJ`,`matchNO`,`place`),
KEY `mp` (`matchNO`,`place`),
CONSTRAINT `mp` FOREIGN KEY (`matchNO`, `place`) REFERENCES `match` (`matchNO`, `place`),
CONSTRAINT `teamNameJ` FOREIGN KEY (`teamNameJ`) REFERENCES `team` (`teamName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
ACMAIN_CHM 2010-12-22
  • 打赏
  • 举报
回复
或者改为
CREATE TABLE `match` (
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`matchGoals` int(11) DEFAULT NULL,
PRIMARY KEY (`matchNO`,`place`),
KEY (`place`),
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
ACMAIN_CHM 2010-12-22
  • 打赏
  • 举报
回复
你想实现的功能是什么?

或者改为如此
CREATE TABLE `join` (
`teamNameJ` varchar(50) NOT NULL,
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`result` varchar(50) DEFAULT NULL,
PRIMARY KEY (`teamNameJ`,`matchNO`,`place`),
KEY `matchNO` (`matchNO`),
KEY `place` (`place`),
CONSTRAINT `matchNO` FOREIGN KEY (`matchNO`) REFERENCES `match` (`matchNO`), //正常
CONSTRAINT `teamNameJ` FOREIGN KEY (`teamNameJ`) REFERENCES `team` (`teamName`),//正常
CONSTRAINT `place` FOREIGN KEY (matchNO,`place`) REFERENCES `match` (matchNO,`place`) //place外键无法插入
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
rucypli 2010-12-22
  • 打赏
  • 举报
回复
KEY mp (matchNO,place),
FOREIGN KEY (matchNO,place) REFERENCES `match` (matchNO,place)
rucypli 2010-12-22
  • 打赏
  • 举报
回复
FOREIGN KEY (matchNO,place) REFERENCES `match` (matchNO,place)
iihero_ 2010-12-22
  • 打赏
  • 举报
回复
可能你对主键的概念理解不够深入,子表的外键必须依赖的是主表的主键的全部。
这样写就对了:
CREATE TABLE `join` (
`teamNameJ` varchar(50) NOT NULL,
`matchNO` varchar(50) NOT NULL,
`place` varchar(50) NOT NULL,
`result` varchar(50) DEFAULT NULL,
PRIMARY KEY (`teamNameJ`,`matchNO`,`place`),
KEY `matchNO1` (`matchNO`),
KEY `place` (`place`),
CONSTRAINT `matchNO` FOREIGN KEY (`matchNO`, `place`) REFERENCES `match` (`matchNO`, `place`),
CONSTRAINT `teamNameJ` FOREIGN KEY (`teamNameJ`) REFERENCES `team` (`teamName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧