0

UPDATEテーブルの他の行を引数として使用する関数の結果を使用して、テーブルのすべてのレコードを取得しようとしています。ただし、すべてのレコードに対するこの操作の結果は、最初のレコードから繰り返されます。なぜこれが当てはまるのか、誰でも説明できますか?

def fun(a,b,c,d):
    return a + b + c + d

cur = conn.cursor()

cur.execute("SELECT field1, field2, field3, field4 FROM TABLE1")

for row in cur:
        cur.execute("UPDATE TABLE1 SET field5 = ?", (fun(row[0],row[1],row[2],row[3]),))

完成したテーブルは次のようになります。

field1, field2, field3, field4, field5
4, 3, 2, 1, 10
7, 3, 1, 0, 10
8, 5, 2, 0, 10

次のようになります。

field1, field2, field3, field4, field5
4, 3, 2, 1, 10
7, 3, 1, 0, 11
8, 5, 2, 0, 15
4

3 に答える 3

0

これは古くて解決済みの問題であることはわかっていますが、どうしようもありません。

これは、独自の列からの値でテーブルを更新する最悪の方法です。必要なのは、データベースで実行される 1 つの更新ステートメントだけです。

UPDATE table SET 
field1 = function(params1), 
field2=function(params2),   
field3=function(params3),   
field4=function(params4)
WHERE
<condition>

テーブル内のすべての行に対して実行する場合は、where 句は必要ありません。必要なのは、データベース内でユーザー関数を定義することだけです。これは、Python で行うことと非常によく似ています。

このようにして、更新は約... 1000倍高速になります。誇張はありません。

于 2014-02-07T14:42:50.153 に答える