1

私は次の設定をしています:

表1:

latdouble
3
4
5
1
6
2
6
9

表 2:

time    latdouble(type double)    latvarchar(type varchar)   
2:00                              3
3:00                              4
4:00                              5
5:00                              1
6:00                              6
7:00                              2
8:00                              6
9:00                              9

基本的に、Table1 の latdouble は正しい順序であり、値をそのまま Table2 にコピーしたいと思います。結果は次のようになります。

表 2:

time    latdouble(type double)    latvarchar(type varchar)   
2:00    3                         3
3:00    4                         4
4:00    5                         5
5:00    1                         1
6:00    6                         6
7:00    2                         2
8:00    6                         6
9:00    9                         9

私の知る限り、次のようなコマンドを使用する必要があります。

update Table2 set latdouble = (select latdouble from Table1)

ただし、次のエラーが表示されます。

ERROR: more than one row returned by a subquery used as an expression

簡単な修正があると確信していますが、理解できません。

ありがとう、ジェームズ

更新: これがどのように発生したかを説明しましょう。表 2 はもともと次のようになっていました。

表 2:

time    latvarchar(type varchar)   
2:00    3                         
3:00    4                         
4:00    5                         
5:00    1                         
6:00    6                         
7:00    2                         
8:00    6                         
9:00    9

Table2 に latdouble(type double) 列を追加しました。

次に、latdouble(type double) という列を含む Table1 という新しいテーブルを作成しました。次のコマンドを使用して、Table2 から latvarchar をキャストし、それを Table1 にコピーしました。

insert into Table1 (latdouble) select cast(latvarchar as double precision) from Table2

そして今、値を Table1 latdouble から Table2 latdouble にコピーしたいと思います。これを行った理由は、値を latvarchar から double にキャストし、いくつかのインデックスを持つ非常に大きなテーブルであるため、Table2 全体の一時コピーを作成せずに latdouble に保存するためです。

4

1 に答える 1

2

私の理解が正しければ、Table1 を使用する必要はまったくありません。latdoubleUPDATE を使用して、各行の値を簡単に設定できます。

UPDATE Table2 SET latdouble = cast(latvarchar as double precision);

アップデート

これを段階的に行うには、2 つのオプションを考えることができます。

オプション 1. (クイック アンド ダーティ)

UPDATE Table2 
SET latdouble = cast(latvarchar as double precision)
WHERE tKey IN (SELECT tKey FROM Table2 WHERE latdouble IS NULL LIMIT 10000);

行が更新されなくなるまで、これを何度も実行します (つまり、どのlatdoubleフィールドも NULL になりません) 。

オプション 2. (カーソルを使用して段階的にコミットする)

この記事の方法に従って、次のPython スクリプトを実行できます。

#!/home/postgres/python/bin/python
#
# incremental commits
# 2008 kcg

import psycopg2
import time

# vars
incremental_commit_size=10000   # number of rows
throttle_time=0         # seconds

connectstr="host=localhost dbname=postgres user=postgres port=5432"
handle=psycopg2.connect(connectstr)
cursor=handle.cursor()
cursor2=handle.cursor()
sql="select tKey from table2"
cursor.execute(sql)

while 1:

 output = cursor.fetchmany(incremental_commit_size)

 if not output:
  break
 for row in output:

   # update table
   sql="update table2 set latdouble = cast(latvarchar as double precision) where tKey = %s"
   cursor2.execute(sql,([row[0]]))

 #commit, invoked every incremental commit size
 handle.commit()
 time.sleep(throttle_time)

handle.commit()
于 2012-12-05T15:37:35.387 に答える