1

我有两张桌子。PersonPhones。许多电话号码可以通过外键与一个人相关联。如果我想添加一个电话号码并将其映射到特定的人,我的 SQL 应该是什么样子?

据我了解:

  1. SQL 语句应该是事务性的,因此首先我必须将人员插入Person表中,然后在插入电话号码Phones并将其映射到表中刚刚插入的行Person

  2. 如果行已经存在于另一个表中怎么办?我应该如何处理?

我正在寻找一个干净简单的解决方案或 sql 示例。

注意:我无权创建存储过程。

4

1 回答 1

1

如果你Person用 new Phones 插入一个新的,那么你会

  1. 插入Person表中。
  2. 用于LAST_INSERT_ID()获取刚刚在该插入上生成的 ID。
  3. 使用该 ID 将记录插入Phone表中。

如果您要Phone为现有的 s 插入新的 s Person,那么您会

  1. Person如果您还没有 ID,请选择以获取其 ID

  2. 使用该 ID 将记录插入Phone表中。

    如果行已经存在于另一个表中怎么办?我应该如何处理?

在此上下文中定义“已经存在”。什么定义了数据的唯一性?在这种情况下,您可能需要考虑将该唯一性定义合并到该表的主键中。(可以由多个列组成。)否则,您必须SELECT从表中查看该行是否已存在。如果是,请更新它。如果没有,请插入它。(或者您希望在您的域中以逻辑方式处理已经存在的数据。)

请记住,在这种情况下,很容易过度使用独特性。例如,您可能想尝试在这些表之间创建多对多关系,以避免重复电话号码。在现实世界的场景中,这最终不是一个好主意,因为有可能:

  1. 两个人共用同一个电话号码。
  2. 这两个人中的一个改变了他/她的号码,但另一个没有。

在过度标准化的情况下,上述事件将导致以下情况之一:

  1. 两个用户的电话号码在只有一个实际更新时都会更新,从而导致另一个用户的数据不正确。
  2. 您必须编写过于复杂的代码来检查这种情况并创建新记录(解除之前的多对多关系),从而导致大量不必要的代码和故障点。
于 2013-10-06T12:44:16.840 回答