mysql - 多个主/外键

标签 mysql

老实说,我对主键和外键的工作方式有点模糊。这里有人告诉我要设置我的数据库,这样我就有了 7 个表,一个用于组织,一个用于类别、服务和文化,以及三个交叉引用表,一方面是组织,另一方面是类别、服务和文化其他。

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

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

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

最佳答案

您所说的是多对多关系。使用交叉引用表,您走在正确的道路上。

回顾一下外键和主键的工作原理是很好的;每张表只能有一个主键,但可以有多个外键。但是,请注意,主键不必限于一列;您可以拥有一个跨越两列、三列或更多列的主键。

您的解决方案是使用两个外键,一个用于每个列/表关系,一个主键跨越两个表。

这是我曾经使用过的一个表的示例,它以多对多的关系链接城市和县。

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>

我建议就该主题进行一些额外阅读。看来您的开端不错。

关于mysql - 多个主/外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297483/

相关文章:

mysql - 使用 Node.js 和 mysql 进行工作

php - MySQL创建多个表的语法

MySQL - 如何选择没有特定数据的查询值

MySQL 搜索用户及其角色

MySQL,mysqlbinlog加载错误后恢复数据库?

php - 比较 mysqli 查询中的值

python - 用于模糊(?)搜索软件数据库的 MySQL 查询

mysql - 在 sql 查询中返回前 3 个计数值

java - SQLException "No value specified for parameter 3"

mysql - 通过更新更改 MySQL 日期格式