2012-03-20 39 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