Php 更新多个数据的更好方法

Php 更新多个数据的更好方法,php,mysql,Php,Mysql,我有一个MySQL表,其中行联系人id对于每个用户id都是唯一的 history: - hist_id: int(11) auto_increment primary key - user_id: int(11) - contact_id: int(11) - name: varchar(50) - phone: varchar(30) 服务器将不时收到特定用户id的新联系人列表,需要更新此表,插入、删除或更新与以前信息不同的数据 例如,当前数据为: 因此,服务器将接收以下数据: 新的数据

我有一个MySQL表,其中行联系人id对于每个用户id都是唯一的

history:
- hist_id: int(11) auto_increment primary key
- user_id: int(11)
- contact_id: int(11)
- name: varchar(50)
- phone: varchar(30)
服务器将不时收到特定用户id的新联系人列表,需要更新此表,插入、删除或更新与以前信息不同的数据

例如,当前数据为:

因此,服务器将接收以下数据:

新的数据是:

如您所见,第一行(John)被更新,第二行(Mary)被删除,其他一些行(Jeniffer)被包括在内

今天我要做的是删除具有特定用户id的所有行,并插入新数据。但是自动递增字段(hist_id)越来越大

Obs:Table有大约8万条记录,每天更新30次或更多。

我有一些(相关)问题:

1.在这种情况下,您认为从特定用户id中删除所有记录并插入更新的数据是一种好方法吗

2.删除自动增量字段怎么样?我不需要它,但我认为没有主键的表不是一个好主意

3.或者更好的方法是循环新数据,选择每个用户id/联系人id来比较要更新的值

对于更好的方法,我指的是最有效的方法

非常感谢你的帮助

  • 在这种情况下,您认为从特定用户id中删除所有记录并插入更新的数据是一种好方法吗
  • 简短回答 不可以。您应该利用“upsert”,它是“重复密钥更新时插入”的缩写。这意味着,如果您插入的密钥对已经存在,则使用指定的数据更新指定的列。然后缩短逻辑并减少增量。下面是一个示例,使用您的表结构应该可以工作。这还假设您已将用户id和联系人id字段设置为唯一

    INSERT INTO history (user_id, contact_id, name, phone)
    VALUES
        (1, 23, 'James Jr.', '(619)-543-6222')
    ON DUPLICATE KEY UPDATE
        name=VALUES(name),
        phone=VALUES(phone);
    
    此查询应保留联系人id,但用新数据覆盖先前存在的数据

  • 删除自动增量字段怎么样?我不需要它,但我认为没有主键的表不是一个好主意
  • 主键并不意味着自动递增的值。我可以使用一个varchar字段作为主键,其中包含水果和蔬菜的名称。这是否针对性能进行了优化?可能不会。在许多情况下,可能需要自动递增,并且有明确的理由避免这种情况。这完全取决于您希望如何访问数据,以及这将如何影响未来的扩展。在您的情况下,我将从表结构开始,重新思考您希望如何存储和访问数据。您想写更多的逻辑来控制数据吗或者您想让数据自己自然流动吗?您已经创建了一个历史记录表,乍一看,它的功能更像一个混合多对一人行横道。如果不看剩下的表结构,我不一定会一时兴起说这不是一个好主意。我能说的是,我会做得有点不同。我将在下一个问题中更具体地回答这个问题

  • 或者更好的方法是循环新数据,选择每个用户id/联系人id来比较要更新的值
  • 为了更新数据,我会避免在数据中循环。这是SQL的工作,它很好地完成了这项工作。有时,我们可能会发现自己处于这样一种情况:我们必须这样做,以提取特定格式的数据,或者以某种方式修复数据。但是,避免这样做以插入或更新数据。它会对性能产生负面影响,您可能会将自己陷入困境

    history:
    - hist_id: int(11) auto_increment primary key
    - user_id: int(11)
    - contact_id: int(11)
    - name: varchar(50)
    - phone: varchar(30)
    
    回到我在你第二个问题末尾所说的,这将帮助你明白我在说什么。我将假设user\u id是一个主键,它在user表中自动递增。我将在这里做一些客户评估,并向您展示如何重新设计用户联系人电话号码结构的示例。下面是我创建的一个快速模型,它显示了表之间的外键关系

    注意:列名和总体数据安排可以采用不同的方式,但我很快就这样做了,以便为您提供一个规范化数据库结构的良好示例。所有外键都有一个结构布局,它以一种使您能够在数据进入和离开系统时控制数据流的方式分隔数据。下面是我使用MySQL Workbench创建的数据库模型的屏幕截图


    (来源:)

    这样你可以更仔细地观察它

    您会注意到“person”表是从用户中提取的,但与联系人共享数据。这使您能够将所有“人员”存储在一个位置,将所有“用户”存储在另一个位置,并将所有“联系人”存储在另一个位置。现在,我们为什么要这样做?第一个原因可以在两种情况下解释

    1。)假设我们有人,在这个例子中,我会叫他“吉姆·比恩”。“JimBean”为该公司工作,因此他是该系统的用户。但是,“Jim Bean”碰巧拥有一个副业,同时也为公司做联络工作。因此,他既是系统的联系人也是用户。在一个更为“扁平表”的环境中,JimBean将有两条记录,其中包含相同的数据,这些数据可能会很快过时或不正确

    2。)假设吉姆做了一些坏事,公司不想再和他有任何关系。他们不想要任何关于他的记录——就好像他从未存在过一样。我们所要做的就是从Person表中删除JimBean。就这样。因为对外关系已经“层叠”更新