使用SQL按顺序更新行

时间:2012-03-20 14:46:47

标签: sql sqlite

我有一个包含4列的表格。第一列对于每一行都是唯一的,但它是一个字符串(URL格式)。 我想更新我的表,但不是使用“WHERE”,我想按顺序更新行。 第一个查询将更新第一行,第二个查询将更新第二行,依此类推。

那是什么SQL代码?我正在使用Sqlite。

编辑:我的表架构

CREATE table (
url varchar(150),
views int(5),
clicks int(5)
)

Edit2:我现在正在做的是一个SQL查询循环

更新表设置视图= 5,单击= 10,其中url =“http://someurl.com”;

数据库中有大约400万条记录。我的服务器需要大约16秒来进行更新。由于循环按顺序更新行,所以第一个查询更新第一行;我在想是否按顺序更新行可能比使用需要浏览400万行的WHERE子句更快。

1 个答案:

答案 0 :(得分:1)

如果不使用WHERE,则无法执行所需操作,因为这是方式从表中选择行以进行读取,更新或删除。所以你会想要使用:

UPDATE table SET url = ... WHERE url = '<whatever>'

HOWEVER ... SqlLite有一个额外的功能 - autogenerated column, ROWID。您可以在查询中使用此列。默认情况下,您不会看到此数据,因此如果您需要其中的数据,则需要明确请求它,例如:

SELECT ROWID, * FROM table

这意味着您可以直接执行您想要引用此列的内容:

UPDATE table SET url = ... WHERE ROWID = 1

您仍然需要使用WHERE子句,但这允许您以插入顺序访问行而不执行任何其他操作。

<强> CAVEAT
ROWID有效地存储行的INSERT顺序。如果从表中删除行,则剩余行的ROWID将 NOT 更改 - 因此可能在ROWID序列中存在间隙。这是设计上的,没有解决方法,无法重新创建表并重新填充数据。

<强>可移植性
请注意,这仅适用于SQLite - 如果您需要移植它,您可能无法对其他SQL引擎执行相同的操作。添加一个可以使用和管理的EXPLICIT自动编号列(也称为IDENTITY字段)会更好。