1

:

現在、すべてのデータを 1 つの PostgreSQL 'Bigtable' テーブルにスクレイピングしました (約 1.2M 行あります)。次に、設計を個別のテーブルに分割する必要があります。これらのテーブルはすべて、Bigtable に依存しています。一部のテーブルにはサブテーブルがある場合があります。モデルは雪の結晶のように見えます。

問題:

テーブルにデータを挿入するための最良のオプションは何ですか? 「SQL」またはPLgSQLで記述された関数で挿入を行うことを考えました。しかし、自動生成された ID にはまだ問題があります。

また、この問題の解決を容易にするツールを知っている場合は、投稿してください。

//編集例を追加しました。これは説明のためだけの実際のケースではありません.

4

3 に答える 3

1

120 万行は多すぎません。最適なツールは、コンソール「psql」から実行される SQL スクリプトです。より新しいバージョンの Pg を使用している場合は、必要に応じてインライン関数 (DO ステートメント) を使用できます。しかし、おそらく最も便利なコマンドは INSERT INTO SELECT ステートメントです。

-- file conversion.sql
DROP TABLE IF EXISTS f1 CASCADE;
CREATE TABLE f1(a int, b int);
INSERT INTO f1
   SELECT x1, y1 
      FROM data
     WHERE x1 = 10;

    ...

-- end file

psql mydb -f conversion.sql
于 2011-12-29T13:15:31.867 に答える
0

あなたの質問を理解できれば、次のような psql 関数を使用できます。

CREATE OR REPLACE FUNCTION migration() RETURNS integer AS
$BODY$
DECLARE
   currentProductId   INTEGER;
   currentUserId      INTEGER;
   currentReg         RECORD;
BEGIN
   FOR currentReg IN
     SELECT * FROM bigtable
   LOOP
     -- Product
     SELECT productid INTO currentProductId 
     FROM product 
     WHERE name = currentReg.product_name;

     IF currentProductId IS NULL THEN
        EXECUTE 'INSERT INTO product (name) VALUES (''' || currentReg.product_name || ''') RETURNING productid' 
        INTO currentProductId;
     END IF;

     -- User
     SELECT userid INTO currentUserId 
     FROM user
     WHERE first_name = currentReg.first_name and last_name = currentReg.last_name;

     IF currentUserId IS NULL THEN
        EXECUTE 'INSERT INTO user (first_name, last_name) VALUES (''' || currentReg.first_name || ''', ''' || currentReg.last_name || ''') RETURNING userid' 
        INTO currentUserId;

        -- Insert into userAdded too with: currentUserId and currentProductId
        [...]

     END IF;

     -- Rest of tables
     [...]    

    END LOOP;
  RETURN 1;
END;
$BODY$
LANGUAGE plpgsql;

select * from migration();

この場合、各テーブルが独自の主キー シーケンスを実行すると想定されており、簡略化するためにテーブル内のフィールドの数を減らしています。お役に立てば幸いです。

于 2011-12-30T12:16:47.503 に答える