我有一个位置表,有一个 ID 的主键。
我还有 location_lonlat 表,其中包含一个名为 LID(用于位置 ID)的列。
这就是这两个表当前的关联方式。
我想在其中一个表上创建一个外键,如果我坚持它目前的工作方式(最简单的方法),那么我应该从locations_lonlat.LID 创建一个指向locations.id 的外键。
当我尝试这样做时,出现错误
“ALTER TABLE 语句与 FOREIGN KEY 约束冲突”
我认为这是因为 location.id 是一个主键,我可能会绕过它,但似乎整个方法有点味道。
在位置表上有一个 locationLonLatId 不是更好吗?
无论如何,他们有1-1的关系,所以也许这无关紧要?
什么方法最好?
简而言之,即使在一对一关系的情况下,最好还是识别父表(首先添加记录的表)并建立从父到子的关系。
如果您关心为什么,请进一步阅读...
如果两个表之间的 1 对 1 关系是标识性的(外键成为子键的主键),则相同的数据结构会导致两个表具有相同的主键。唯一的区别是,如果声明了 RI 约束以确保键保持同步,则必须在另一个表(“来自”表)之前将记录添加到另一个表中。
如果子表具有不同的主键,即该关系是非识别性的,则必须从父级到子级添加关系,以便在子级中创建必要的外键属性来保存连接 ID。
在与 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))
Run Code Online (Sandbox Code Playgroud)
外键在非强制一侧声明(如果有的话)。1-1 双非强制要求外键与主键是单独的列。
| 归档时间: |
|
| 查看次数: |
9685 次 |
| 最近记录: |