2011-04-21 51 views
2

我目前正在实施项目的CRUD。我有很多many-to-many的关系。其中一些是table1_id,table2_id,其中一些有额外的列(价格,金额等)。许多到很多crud

什么是更新many-to-many表的最佳方式:如您所见,可能有一些信息已经与新数据一起。

Example

t1_id t2_id amount 
1  3  15 
2  4  50 

我想更新此信息,并发送一些数据,如:{1,3,15}{2,5, 25}。所以我需要更新第一行并插入一个新行。 我想创建一个函数(pl/sql),它将获取记录表并检查它是否是新记录或更新记录。

Question:有没有更好的方法来实现这个?有没有什么模式可以实现这个目标?

回答

0

我几乎总是这样懒惰地执行,只是从交叉引用表中删除所有关联的行,然后运行一条insert语句将其链接回去。理想情况下,这将在交易中完成。在分析性能方面我没有做太多的工作,但是这样做可能不会太糟糕,特别是如果您有大量更新需要完成的话。

+0

我已经做过一次,但我认为这是不利于性能的原因。我会添加额外的插入数量,这比在索引列上选择查询要慢。不是吗? – Fluffy 2011-04-21 18:02:21

+0

这通常不是一个问题,除非你有昂贵的检查约束。这并不是说这是最好的方法。 – tster 2011-04-21 18:08:50

2

您要查找的模式通常称为“UPSERT”:插入一行(如果不存在),否则请更新现有行。您仍然需要遍历行,但是您可以为每行执行一条语句。

我不知道关于PL/SQL,但这个问题可能会有所帮助:Oracle: how to UPSERT (update or insert into a table?)

+0

Oracle直接支持MERGE语句的upsert。您将不得不将双精度的select:v1,:v2,v3作为合并到表中的行。 – 2011-04-24 01:10:16