多个主/外键

时间:2011-11-28 14:42:00

标签: mysql

我要说实话,我对主键和外键的工作方式有些模糊。我被告知要在这里设置我的数据库,这样我就有7个表,一个用于组织,一个用于类别,服务和文化,另一方面用于组织之间的三个交叉参考表,以及类别,服务和文化。其他

以org_culture_xref表为例。我有两列,一个是org_id,它与组织表的org_id列(主键)相同。另一个是cult_id,它与文化表的cult_id列(主键)相同。

我相信org_culture_xref表的两列都是主键和外键。 但是,这似乎不允许我为这两列提供多个值。我希望能够在组织和文化之间建立多种关系 - 因为在每个组织中都可以与多个关联文化和每种文化都可以与多个组织联系起来。

如何确保两列都有多个值?

3 个答案:

答案 0 :(得分:3)

你所谈论的是多对多关系。您使用交叉引用表在正确的路径上。

最好检查外键和主键是如何工作的;每个表只能有一个主键,但可以有多个外键。但是,请注意,主键不必限于一列;您可以拥有一个跨越两列,三列或更多列的主键。

这里的解决方案是拥有两个外键,每个列/表关系一个,以及跨越两个表的一个主键。

以下是我一次使用的一个表的示例,该表以多对多关系链接城市和县。

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>

我建议对这个主题进行一些额外的阅读。看起来你的起步很好。

答案 1 :(得分:1)

交叉引用表的主键将是两列,这意味着两个ID的组合必须是唯一的,但您可以在任一列中重复使用单个ID。

这是创建这样一个表的声明:

CREATE TABLE `x` (
  `a_id` varchar(6) NOT NULL default '',
  `b_id` varchar(6) NOT NULL default '',
  PRIMARY KEY  (`a_id`,`b_id`)
)

问题本身和多对多关系的交叉引用表方法适用于大多数(如果不是全部)关系数据库,但由于我在大约10年内没有使用过mysql,因此我从{{3这似乎是用mysql特定代码对该主题进行了详细讨论。

答案 2 :(得分:1)

org_culture_xref的每一列都是外键:org_idorganization的外键,cult_idculture的外键。其中两个在一起org_culture_xref的主键。

所以,沿着这些方向:

CREATE TABLE org_culture_xref
(
  org_id NUMERIC(10) NOT NULL,
  cult_id NUMERIC(10) NOT NULL,
  PRIMARY KEY (org_id, cult_id),
  FOREIGN KEY (org_id) REFERENCES organization (org_id),
  FOREIGN KEY (cult_id) REFERENCES culture (cult_id)
);