如何将同一表中的一条记录与另一条记录关联?

Posted

技术标签:

【中文标题】如何将同一表中的一条记录与另一条记录关联?【英文标题】:How can I associate one record with another in the same table? 【发布时间】:2014-04-12 16:03:13 【问题描述】:

我在 Access 中创建了一个电缆数据库,并生成了一个报告,其中列出了电缆两端的连接器。每条电缆都有自己的 ID 和 2 个与之关联的连接器 ID。所有连接器都来自同一个表并链接到许多其他表。

我需要一个表(电缆)中的 2 个字段与第二个表中的 2 条记录相关联。

我的解决方案是再创建 2 个表:一个主连接器表和一个辅助连接器表,每个表都包含第一个连接器表中的所有条目。然后我可以在电缆 ID 表中为主要和次要 ID 创建列。这样做的问题是我必须维护 2 个具有相同数据的额外表。

我是数据库理论的新手,但我想知道是否有一些高级方法可以解决这个问题?

任何帮助将不胜感激!

【问题讨论】:

这个问题对我来说有点不清楚,可能涉及几个答案,具体取决于。与每条电缆关联的连接器 ID 会改变吗?另外,假设连接器 id one = a。连接器 ID 2 可以是几个值之一,还是只允许一个特定值?这相当于询问连接器 id 1 和连接器 id 2 是否都在具有连接器 id 1 和连接器 id 2 对的表上形成唯一索引。您有多少不同的连接器 id?存储 (id, connector1, connector2) 并仅迭代连接器 id 1 和 2 的所有可能值是否可行?需要更多信息.... 【参考方案1】:

您需要两张表——您已经有一张:

Cables
  ID autoincrement primary key
  ...

Cables 表应该只描述电缆的属性,而不应该知道电缆如何连接到其他电缆。

第二个表应该是电缆对之间可能的连接的列表以及关于连接的可选描述信息:

Connections
  Cable1ID long not null constraint Connections_Cable1ID references Cables (ID) on delete cascade
  Cable2ID long not null constraint Connections_Cable2ID references Cables (ID) on delete cascade
  ConnectionDesc varchar(100)

这种表称为联结表或映射表。它用于实现多对多关系。通常关系是在两个不同表之间(例如学生和课程),但它同样适用于在相同表中关联两条记录。

此设计可让您在单个查询中加入CablesConnectionsCables(再次)表以获得您需要的报告。

【讨论】:

这看起来很有希望我将不得不研究它(我在这里有点超出我的深度我的问题是我正在尝试添加未知数量的连接器 ID(外键)字段到每条电缆记录。每条电缆都不一样,因此字段的数量会改变。我尝试使用我所说的路由。路由是两个连接器之间的连接。路由表中的每个路由ID都有2个连接器ID。但是,我仍然有同样的问题:每个电缆记录的字段数量未知(在本例中为 Route ID 外键)。 @user3527094 - 对,我建议的设计将为每条电缆处理不同数量的连接。例如,您可以在 Connections 表中记录电缆 1 到电缆 2、电缆 1 到电缆 3 等。事实上,这是使用连接表的结果。 这也回答了我的问题:***.com/questions/25868250/…【参考方案2】:

另一种方法是有一个连接器表,然后在电缆表中使用两个外键。

 CREATE TABLE connector (
     id INT PRIMARY KEY,
     ...
 );

 CREATE TABLE cable (
     primary_connector_id INT NOT NULL REFERENCES connector(id),
     secondary_connector_id INT NOT NULL REFERENCES connector(id),
     ...
 );

【讨论】:

【参考方案3】:

在要连接到其他表的表中创建一个外键。

表一是

+---------------+------------+------+-----+---------+----------------+
| Field         | Type       | Null | Key | Default | Extra          |
+---------------+------------+------+-----+---------+----------------+
| user_id       | int(11)    | NO   | PRI | NULL    | auto_increment |
| name          | varchar(5) | NO   |     | NULL    |                |
| user_group_id | int(11)    | NO   |     | NULL    |                |
+---------------+------------+------+-----+---------+----------------+

表二是

+---------------+---------+------+-----+---------+----------------+
| Field         | Type    | Null | Key | Default | Extra          |
+---------------+---------+------+-----+---------+----------------+
| attendance_id | int(11) | NO   | PRI | NULL    | auto_increment |
| user_id       | int(11) | YES  |     | NULL    |                |
| present       | int(11) | YES  |     | NULL    |                |
| absents       | int(11) | YES  |     | NULL    |                |
+---------------+---------+------+-----+---------+----------------+

表二以user_id作为外键与表一连接

【讨论】:

【参考方案4】:

所以据我了解,您想将一个表链接到另一个表。

使用外键。通过包含您所指向的表的主键将一个表链接到另一个表时使用外键。

CREATE TABLE someTable(
    ID INT PRIMARY KEY
);

CREATE TABLE linkingTable(
    ID INT PRIMARY KEY,
    linked_ID INT,
    FOREIGN KEY (linked_ID) REFERENCES someTable(ID) ON DELETE CASCADE
);

祝你好运。

【讨论】:

您可能应该详细说明您的答案。

以上是关于如何将同一表中的一条记录与另一条记录关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何将每条记录与另一条记录进行比较(名称反转问题)并删除重复记录?

mysql学习之路_高级数据操作

MySQL如何复制表中的一条记录并插入

更新表中的最早一条记录

数据库表关系相关案例

将MYSQL某一数据库中的多条记录批量插入到另一MYSQL数据库时,记录不存在则插入,存在则更新