代码之家  ›  专栏  ›  技术社区  ›  sakana

插入失败,然后更新或加载,然后决定是插入还是更新

  •  0
  • sakana  · 技术社区  · 16 年前

    我有一个java的Web服务,它接收要插入或更新到数据库中的信息列表。我不知道要插入或更新哪一个。

    1. 迭代列表(一个对象列表,上面有表pk),尝试在数据库中插入条目。如果插入失败,请运行更新

    2. 尝试从数据库加载条目。如果检索到的结果更新,则插入条目。

    在第一次调用中,我相信大多数条目都将是新的bd条目,但会有一个饱和点,大多数条目将被更新。

    我说的是一个DB表,它可以以成熟的形式访问超过1亿个条目。

    5 回复  |  直到 16 年前
        1
  •  4
  •   Community CDub    9 年前

    如果您的数据库支持合并,我会认为这是最有效的(并将所有数据视为单个数据集)。

    见:

    http://www.oracle.com/technology/products/oracle9i/daily/Aug24.html

    https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=194

        2
  •  1
  •   HLGEM    16 年前

    如果性能是你的目标,那么首先从你的词汇表中去掉iterate这个词!学会成套做事。

    如果需要更新或插入,请始终先进行更新。否则,您很容易发现自己正在更新意外插入的记录。如果您正在这样做,那么有一个标识符可以帮助您查看记录是否存在。如果标识符存在,则执行更新,否则执行插入。

        3
  •  1
  •   Jorge Ferreira    16 年前

    重要的是要了解插入的数量与您收到的列表更新的数量之间的平衡或比率。IMHO应该实现一个抽象的策略,上面写着“在数据库上持久化这个”。然后制定具体的战略(例如):

    1. 检查主键,如果未找到记录,则插入,否则更新
    2. 其他

    然后从配置文件中提取要使用的策略(例如类完全限定名)。这样,您可以轻松地从一种策略切换到另一种策略。如果可行,可能取决于您的领域,您可以根据集合上的输入实体选择最佳策略。

        4
  •  1
  •   chaos    16 年前

    INSERT INTO foo
    SET bar='baz', howmanybars=1
    ON DUPLICATE KEY UPDATE howmanybars=howmanybars+1
    
        5
  •  1
  •   cope360    16 年前

    方案2不会是最有效的。当您执行实际插入或更新以强制执行主键时,数据库将已经为您执行此检查。通过自己进行此检查,您将产生两倍的表查找开销以及额外的Java代码往返。选择最有可能的情况,并乐观地编码。

    展开选项1,可以使用存储过程来处理插入/更新。本例使用PostgreSQL语法,假设插入是正常情况。

    CREATE FUNCTION insert_or_update(_id INTEGER, _col1 INTEGER) RETURNS void
    AS $$
        BEGIN
            INSERT INTO
                my_table (id, col1)
            SELECT
                _id, _col1;
        EXCEPTION WHEN unique_violation THEN
            UPDATE
                my_table
            SET
                col1 = _col1
            WHERE
                id = _id;
        END;
    END;
    $$
    LANGUAGE plpgsql;
    

    您还可以将更新设置为正常情况,然后检查受update语句影响的行数,以确定该行是否确实是新的,并且您需要执行插入。

    1. 从临时表更新主表中的行
    2. 从临时表在主表中插入新行
    3. 处理临时表