【问题标题】:Updating MySQL Database with foreign keys and Django使用外键和 Django 更新 MySQL 数据库
【发布时间】:2014-01-13 17:00:58
【问题描述】:

我正在为我开始的数据库项目构建布局。自从我上次使用结构化外键等工作已经一年多了,说我生疏是轻描淡写的。

因此,对于我的数据库,我们将有一个包含车辆的表和一个位置表。每辆车都有一个id(VehID)、一个位置(location)和一个名字(title)。位置表具有以下字段:LocID、位置所针对的车辆 ID (VehID),它是来自车辆数据库的外键,它还具有车辆的纬度和经度。

表格如下所示:

-----------
| vehicle | - //Holds all vehicles 
-----------
|  VehID  | - PK, auto_incrementing
|Locations| - //should link to most current location, with location.VehID == vehicle.VehID
|  Title  | - varchar(40)
-----------

-----------
|location |   - //Holds all locations where a vehicle has been
-----------
|LocID    |   - PK, auto_incrementing
|VehID    |   - Foreign Key from vehicle
|Latitude |   - decimal(10,6)
|Longitude|   - decimal(10,6)
-----------

如果有帮助,我将使用 django 框架进行 ORM。每次我尝试向位置表添加新条目时,尝试设置为 VehID 时都会出错...我将如何进行设置?如果我不能,我将如何链接车辆和位置字段?就像我说的......已经有一段时间了。

【问题讨论】:

  • 你不能有这样的双向外键。外键要求引用已经存在,所以你遇到了先有鸡还是先有蛋的问题。
  • 好的,所以假设我删除了 vehicle.location 字段,如果车辆/位置关系是一对多的同时保留,我将使用什么 MySQL 查询将新位置添加到车辆表中VehID 外键?

标签: mysql database django database-design database-schema


【解决方案1】:

这是我解决这个问题的方法:

  • 删除vehicle.Locations(否则两个表之间存在循环关系)
  • 将timestamp 字段添加到location,其中包含车辆到达特定位置的时间
  • 确保始终在 vehicle 中插入条目,然后在 location 中引用它

要查找车辆的当前位置,请在 vehicle.VehId 上进行 GROUP BY 搜索,然后选择时间戳最大小于当前时间的位置。

【讨论】:

  • 太棒了,我真的很感激。我想我必须从车辆表中删除位置字段。我不确定是否有更好的方法来做到这一点。问题是,在更新车辆表时,正确的查询是什么?我目前有INSERT INTO location (VehID, Latitude, Longitude) VALUES (1,38.9, -85.2, 4.8);,但我不能包含 VehID,因为它是外键......那么我该如何设置 VehID?
  • 尝试添加新位置条目时,我得到:Cannot add or update a child row: a foreign key constraint fails
  • 正如他所说,您必须先插入vehicle 表,然后才能添加到location。外键的规则是被引用的行必须加在外键行之前。
  • “我不能包含 VehID,因为它是外键”:实际上,您必须包含它。我的预感是您不确定如何将记录插入vehicle,获取该记录的新VehID,然后使用该VehID 插入location。您需要执行以下操作:stackoverflow.com/questions/1915166/…(如果您使用的是 Java 以外的其他语言,请使用 Google 搜索)。如果我的回答对您有用,请将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多