【问题标题】:How to correctly update / insert into sqlite db如何正确更新/插入sqlite db
【发布时间】:2016-10-13 09:26:21
【问题描述】:

我有列的表: A B C D 插入新行时,我需要检查 DB 中是否已经存在 B。如果 B 存在于 DB 中,我需要将 A 和 D 更改为新值并将 D 增加 1,否则只需将新行插入此 DB。 最正确的方法是什么?我应该使用 2 个数据库操作:尝试选择,如果它存在更新或使用 INSERT 或 REPLACE 或其他方式?

我使用 Python3

【问题讨论】:

    标签: sql python-3.x sqlite


    【解决方案1】:

    您可以使用 SELECT 来完成,但先尝试 UPDATE 会更简单:

    c.execute("UDPATE X SET A = ?, C = ?, D = D + 1 WHERE B = ?", [newA, newC, oldB])
    if c.rowcount == 0:
        c.execute("INSERT INTO X(A,B,C,D) VALUES (?,?,?,?)", [...])
    

    【讨论】:

    • 谢谢,但就像@Amir 一样,您只提供解决方案,而不是解释为什么这种方式比其他方式更好
    • 两个语句比三个少一个。
    【解决方案2】:

    另一种方式如下:

    UPDATE table SET A = 1, C=3, D=D+1 WHERE B = 2;
     INSERT INTO table(A,B,C,D) values (1, 2,3,4 ) WHERE changes() = 0;
    

    如果更新不发生,Changes() 将为 0。 ;)

    正如您在问题中所问的那样,您想知道首先选择然后更新或插入是否更好取决于选择答案。

    UPDATE 的成本与 SELECT + INSERT 几乎相同。因为它需要找到行(读取和搜索)然后更改数据(写入)。如果它没有找到你想要的行,它不会去写。

    因此,如果您先选择然后更新或插入,您将有两种状态:

    1- SELECT(读取)+ UPDATE(读取+写入)

    2- SELECT(读取)+ INSERT(写入)

    但是通过上述查询,您将有两种状态:

    1- 更新(读+写)

    2- UPDATE(没有找到行,所以只是读取)+ INSERT(写入)

    第二个状态就像一个 SELECT 加上一个 INSERT。

    如您所见,两种情况下的第二种状态是相同的,但对于第一种状态,上述情况的读取量会减少。

    【讨论】:

    • 谢谢,但像@CL 一样,您只提供解决方案,而不是解释为什么这种方式比其他方式更好
    • 更新了答案 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2012-10-29
    • 2013-02-23
    相关资源
    最近更新 更多