【发布时间】: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
我有列的表: A B C D 插入新行时,我需要检查 DB 中是否已经存在 B。如果 B 存在于 DB 中,我需要将 A 和 D 更改为新值并将 D 增加 1,否则只需将新行插入此 DB。 最正确的方法是什么?我应该使用 2 个数据库操作:尝试选择,如果它存在更新或使用 INSERT 或 REPLACE 或其他方式?
我使用 Python3
【问题讨论】:
标签: sql python-3.x sqlite
您可以使用 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 (?,?,?,?)", [...])
【讨论】:
另一种方式如下:
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。
如您所见,两种情况下的第二种状态是相同的,但对于第一种状态,上述情况的读取量会减少。
【讨论】: