PHP MySQL:更新联接表?

PHP MySQL:更新联接表?,php,mysql,sql,relationship,Php,Mysql,Sql,Relationship,对于如何最好地更新联接表,我有点困惑 Presentaion id PK Asset id PK PresentationAsset presentationid assetid 因此,在PresentationAsset中更新演示文稿及其关联资产时,我是否首先搜索所有关系,删除这些关系,然后创建新关系 解决这种情况的最佳方法是什么?您有两种选择: 1) 删除所有资产并按您所说的那样创建新资产(def更易于编码和调试。如果您在PresentationAsset中没有PK,那么您可能遇到的唯

对于如何最好地更新联接表,我有点困惑

Presentaion
id PK

Asset
id PK

PresentationAsset
presentationid
assetid
因此,在PresentationAsset中更新演示文稿及其关联资产时,我是否首先搜索所有关系,删除这些关系,然后创建新关系

解决这种情况的最佳方法是什么?

您有两种选择:

1) 删除所有资产并按您所说的那样创建新资产(def更易于编码和调试。如果您在PresentationAsset中没有PK,那么您可能遇到的唯一问题是多次删除可能会在PresentationAsset PK上留下大量数据。)

2) 执行此操作(使用伪代码)

  • 从当前与演示文稿关联的资产中获取所有ID(旧值)。我将此称为array1
  • 对于新值中的每项资产:
    • 如果它已经存在,请使用其新值更新它,并从array1中删除其id
    • 如果不是,就创建它
  • 删除阵列1中PresentationId=currentPresentationId且AssetId为的所有PresentationAsset
希望它足够清楚,希望我正确地理解了您的问题;)我想我可以接受1),但2)可能更好。您可以更新需要更新的值,并删除已删除的值。

至少,删除所有值并创建新值肯定是最简单的。毕竟,这只是两个查询

DELETE FROM PresentationAsset WHERE presentationid = 1
INSERT INTO PresentationAsset VALUES (1, 1), (1, 2), (1, 3)
假设这些确实是该表中仅有的两列(例如,没有时间戳或任何东西),我无法想象还有什么原因需要将其复杂化

毕竟,清除现有行并插入所有新行的替代方法是保留已经存在的行,但删除不再应该存在的行,然后插入新行。基本上,您仍然会得到至少一个
DELETE
和一个
INSERT
,因此在大多数实际应用程序中,性能应该不会有太大差异。在第一种方法中,性能甚至可能更好,因为它需要更少的每个操作的值检查

当然,如果您正在处理一个足够大的场景,其中如此微小的性能差异非常重要,那么您可能希望对所有选项进行真正的测试,并自己测量性能


当然,如果表中不是只有这两列,则需要为要更新的行正确保留其他列的值,因此无论如何都不能删除所有列并插入新列。

是的,这正是我所想的。搜索现有数据、匹配那些没有变化的数据等等都会非常痛苦。谢谢你的回复。