什么你所谈论的是一个多到多关系。您正在使用交叉引用表的正确路径。
查看外键和主键如何工作是很好的;每个表只能有一个主键,但可以有多个外键。但是,请注意,主键不必局限于一列;您可以拥有跨越两列,三列或更多列的主键。
这里的解决方案是有两个外键,一个用于每个列/表关系,另一个用于跨两个表的主键。
下面是我一次使用的表格的示例,该表格以多对多的关系链接城市和县。
mysql> show create table xref_cities_counties\G
*************************** 1. row ***************************
Table: xref_cities_counties
Create Table: CREATE TABLE `xref_cities_counties` (
`city_id` int(10) unsigned NOT NULL,
`county_id` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`city_id`,`county_id`),
KEY `city_id` (`city_id`),
KEY `county_id` (`county_id`),
CONSTRAINT `fk_xrefcitiescounties_cityid` FOREIGN KEY (`city_id`) REFERENCES `florida_cities` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_xrefcitiescounties_countyid` FOREIGN KEY (`county_id`) REFERENCES `florida_counties` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql>
mysql>
mysql> describe xref_cities_counties;
+-----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| city_id | int(10) unsigned | NO | PRI | | |
| county_id | tinyint(3) unsigned | NO | PRI | | |
+-----------+---------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql>
我会建议一些关于这个主题的额外阅读。看起来你是一个好开始。
每当我尝试这样做,它似乎取代了以前的ID。为什么会这样? –
@JakeSmith对不起 - 正如我所说的,我的mysql已经无法使用,所以我无法指导您正确创建超出create table语句的主键的详细信息。 –
@JakeSmith如果您已经创建了一个表,您不想使用该“CREATE TABLE”语句,因为该语句不包含任何外键定义。如果我没有记错的话,你会想使用'ALTER TABLE'语句。 –