在一对一的关系中外键应该走哪条路?

本文关键字:条路 一对一 关系 | 更新日期: 2023-09-27 18:15:23

我有一个位置表,有一个主键ID

我还有一个locations_lonlat表,它包含一个名为LID的列(用于位置id)。

这是这两个表当前的关联方式。

我想在其中一个表上创建一个外键,如果我要坚持它目前的工作方式(最简单的方法),那么我应该从创建一个外键locations_lonlat。指向locations.id.

当我尝试这样做时,我得到一个错误

" ALTER TABLE语句与FOREIGN KEY约束冲突"

我认为这是因为位置。id是一个主键,我可能可以绕过它,但似乎这整个方法有点臭。

在位置表中添加一个locationlonlid不是更好吗?

他们有一个1-1的关系,所以也许这并不重要?

什么方法是最好的?

在一对一的关系中外键应该走哪条路?

总之,最好标识父表(首先向其中添加记录的表)并建立从父表到子表的关系,即使在1对1关系的情况下也是如此。

如果你关心为什么,请继续阅读…

情况1

如果两个表之间的1对1关系是标识的(外键成为子表的主键),则在两个表中产生相同的数据结构,具有相同的主键。唯一的区别是,如果声明RI约束以确保键保持同步,则必须在一个表("from"表)之前将一条记录添加到另一个表。

情况2

如果子表具有不同的主键,即关系是非标识的,则必须从父表添加关系到子表,以便在子表中创建必要的外键属性来保存连接ID。

3

情况

在与1)(1对1,表之间具有标识关系)相同的情况下,但是在关系的子端基数显示为可选,因此让关系从父端走向子端是有意义的。

如果关系是从子表到父表,则导致父表的外键属性必须为空(以允许没有子记录的父记录),因此如果没有子记录,父记录有时会在此字段中具有NULL。

如果关系是从父表到子表,则外键在子表中,父表中不存在外键。在这种情况下,要么有子记录(1到1),要么没有子记录(1到0)。就存储而言,这导致了更有效的结构。

1-1的关系是这样的

CREATE TABLE tbl1 ( id ... PRIMARY KEY (id))
CREATE TABLE tbl2 ( id ... PRIMARY KEY (id),
    FOREIGN KEY fk_tbl2_tbl1 REFERENCES tbl1(id))

在非强制端声明外键(如果有的话)。1-1 double非强制性要求外键与主键分开列

即使在1:1关系中,也总是存在一个主体和从属实体,主体实体是独立存在的,如果两者不能独立存在,那么你就有一些规范化问题,因为它们属于同一个表。

一个真正的一对一是表共享主键,其中主体的主键是自动递增的,并且依赖的键有一个外键引用到主体

我认为你有一个1:M的关系,其中位置有许多longlat(根据数据库),但你可以使locations_lonlat。盖子独特。

你得到错误的原因我认为是有现有的数据在locations_lonlat。LID有一些值不对应于location。div id表。