2012-03-20 60 views
0

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

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

编辑:我的表架构

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

EDIT2:我在做什么,现在是SQL的环请求

更新表组的意见= 5,单击= 10,其中URL =“HTTP ://someurl.com“;

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

+2

你真的需要发布一个DDL。但看起来你并没有以正确的方式接近解决方案。 – 2012-03-20 14:49:55

+0

我加了。这很简单。 – 2012-03-20 14:52:48

+0

请详细说明。按什么顺序?哪一列?一个想要像这样一排排地走的过程的本质是什么?你想要做什么或者为什么? – 2012-03-20 14:54:53

回答

1

如果不使用WHERE,你不能做你想要的,因为这是只有方式来从表中选择行来读取,更新或删除。所以,你将要使用:

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

无论其 ... SqlLite有一个额外的特点 - autogenerated column, ROWID。您可以在查询中使用此列。你没有看到在默认情况下这个数据,所以如果你想在其中的数据,你需要明确地提出要求,如:

SELECT ROWID, * FROM table 

这意味着,你可能能够做到你想要引用该什么直接列:

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

你仍然需要使用WHERE条款,但是这允许您访问中插入的顺序行,而不做其他任何事情。

CAVEAT
ROWID有效存储INSERT顺序排的。如果从表中删除行,其余行的ROWID将会变为而不是更改 - 因此可能在ROWID序列中存在间隙。这是设计完成的,没有解决方法,无法重新创建表并重新填充数据。

PORTABILITY
请注意,这仅适用于SQLite的 - 你可能不能够做到与其它SQL引擎同样的事情,你应该永远需要端口这一点。添加您可以使用和管理的EXPLICIT自动编号列(又名IDENTITY字段)会更好。

+0

感谢ROWID解决方案,我在找什么。我希望它有一些性能提升:) – 2012-03-20 15:09:16