2011-11-28 118 views
1

我要说实话,我对主键和外键的工作方式有些朦胧。我被告知要在这里设置我的数据库,以便我有7个表格,一个用于组织,一个用于类别,服务和文化,一个用于组织,另一个用于分类,服务和文化其他。例如多个主/外键

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

我相信org_culture_xref表的两列都是主键和外键。 但是,这似乎并没有让我对这两列都有多个值。我希望能够在组织和文化之间建立若干关系 - 因为每个组织都可以与多种文化相关联,每种文化都可以与多个组织相关联。

如何确保我可以有两个列的多个值?

回答

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,我从here那里得到了这个代码,这个代码似乎有关于mysql特定代码的主题的详细讨论。

+0

每当我尝试这样做,它似乎取代了以前的ID。为什么会这样? –

+0

@JakeSmith对不起 - 正如我所说的,我的mysql已经无法使用,所以我无法指导您正确创建超出create table语句的主键的详细信息。 –

+0

@JakeSmith如果您已经创建了一个表,您不想使用该“CREATE TABLE”语句,因为该语句不包含任何外键定义。如果我没有记错的话,你会想使用'ALTER TABLE'语句。 –

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) 
); 
+0

当我尝试删除我的上一张表并使用此SQL代码时,它给了我一个关于无法创建表的错误消息。 –

+0

@JakeSmith:'org_id'和'cult_id' **具有与它们的引用相同的类型,如表org中的ord_id和cult中表中的cult_id一样 –

+1

@JakeSmith:无法访问你的数据库,所以我需要对你没有明确表达的东西做一些猜测。如果其中一项或多项猜测错误,您将收到错误消息。除非你给我更多的信息,否则我不能再帮忙。 (例如,为什么不告诉我错误信息是什么?而不是写出“关于不能创建表的错误消息”)。 – ruakh

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> 

我会建议一些关于这个主题的额外阅读。看起来你是一个好开始。