[pgsql-jp: 34262] 同一テーブル内での列コピー

it_555_it @ excite.co.jp it_555_it @ excite.co.jp
2004年 11月 11日 (木) 23:06:33 JST


こんばんは。
島田と申します。

test --- pk(id,name), date1(not null)

id     name     date1   date2
-----------------------------
1      a     2004/10/1  2004/11/1
2      a     2004/12/1
3      b     2005/1/1   2005/2/1
4      c     2005/2/1

〜〜〜 snip 〜〜〜

上記のようなテーブルがあり、date2がNULLの時には、
date1の値をそのままdate2に移行したいと思っています。
レコード数は2万ほどあり、極端に時間のかかる処理(5分以上)はNGです。

実は、SQLで簡単にできればそうしたいですし、
プロシージャでも工夫をすれば、負荷をかけずにスマートにできるということであればそうしたいと思っています。
もし、いずれも駄目な場合には、PHPでファイルに落として、\COPYを絡めて、
やっていこうと思っています。

スマートで簡単な方法があるようでしたらば、教えて頂けたらと思います。

以下書いてみたplpgsqlです。
2万行では一体いくらかかるのか、というくらい待たされて諦めました。

CREATE OR REPLACE FUNCTION date_to_date()
RETURNS INTEGER AS '
  DECLARE
   var_id TEXT;
   var_name TEXT;
   i INTEGER;
   j INTEGER;
   k INTEGER;
   numrows INTEGER;
  BEGIN

        SELECT count(*) INTO j FROM test;

        FOR i IN 1..j LOOP

                SELECT i - 1 INTO k;
                SELECT id INTO var_id FROM test ORDER BY id,name LIMIT 1 OFFSET k;
                SELECT name INTO var_name FROM test ORDER BY id,name LIMIT 1 OFFSET k;
                UPDATE test SET date2 = (SELECT date1 FROM test WHERE id = var_id AND name = var_name)
                        WHERE date2 IS NULL AND id = var_id AND name = var_name;

        END LOOP;

        SELECT count(*) INTO numrows FROM test WHERE date2 IS NOT NULL;
        RETURN numrows;
  END;
'
LANGUAGE 'plpgsql';

SELECT date_to_date();
DROP FUNCTION date_to_date();



pgsql-jp メーリングリストの案内