MSSQL将行插入关系表。

时间:2013-10-06 12:32:22

标签: sql sql-server relational-database

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

根据我的理解:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果您使用新的Person插入新的Phone,那么您将

  1. 插入Person表。
  2. 使用LAST_INSERT_ID()获取刚刚在该插页上生成的ID。
  3. 使用该ID将记录插入Phone表。
  4. 如果您为现有Phone插入新的Person,那么您将

    1. 选择Person以获取其ID(如果您还没有)
    2. 使用该ID将记录插入Phone表。

        

      如果另一个表中已存在行,该怎么办?我该怎么处理呢?

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

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

      1. 两个人共用同一个电话号码。
      2. 这两个人中的一个改变了他/她的号码,但另一个没改变。
      3. 在过度规范化的情况下,上述事件将导致以下情况之一:

        1. 两个用户的电话号码只有在其中一个实际更新时才会更新,导致其他用户的数据不正确。
        2. 您必须编写过于复杂的代码来检查此方案并创建新记录(取消之前的多对多关系),从而导致大量不必要的代码和失败点。