[解決済み] PostgresのテーブルをSQLで完全にコピーする
質問
免責事項 この質問はstack overflowの質問と似ている ここで に似ていますが、後で説明するように、これらの回答はどれも私の問題には役立ちません。
私は、多くの列がインデックスされている postgres の大きなテーブル (~40M rows, 100+ columns) をコピーしようとしています。現在、私はこの SQL のビットを使用しています。
CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
この方法には2つの問題があります。
- データ取り込みの前にインデックスを追加するため、インデックスなしでテーブルを作成し、すべてのデータをコピーした後にインデックスを作成するよりもはるかに時間がかかるでしょう。
- これは `SERIAL' スタイルのカラムを正しくコピーしません。新しいテーブルに新しい 'counter' を設定する代わりに、新しいテーブルの列のデフォルト値を過去のテーブルのカウンターに設定します。
テーブルのサイズにより、インデックスの作成がリアルタイムで問題となります。また、再インデックス化のためにファイルにダンプすることも不可能になります。また、コマンド ラインの利点もありません。SQL でこれを行う必要があります。
私がやりたいことは、奇跡のコマンドで正確なコピーを作成するか、それが不可能な場合、すべての制約でインデックスなしでテーブルをコピーし、それらが制約の「精神」であることを確認します (別名 SERIAL 列の新しいカウンタ)。それから、すべてのデータを
SELECT *
ですべてのデータをコピーし、すべてのインデックスの上にコピーします。
ソース
-
データベースのコピーに関するStack Overflowの質問 : これは3つの理由で私が求めているものではありません。
-
これは、コマンドラインオプション
pg_dump -t x2 | sed 's/x2/x3/g' | psql
で、この設定では、私はコマンドラインにアクセスできないので - データ取り込み前にインデックスを作成するので、時間がかかる
-
によって証明されるように、シリアルカラムを正しく更新しません。
default nextval('x1_id_seq'::regclass)
-
これは、コマンドラインオプション
-
postgresテーブルのシーケンス値をリセットするメソッドです。 : これは素晴らしいのですが、残念ながら非常に手動です。
どのように解決するのですか?
まあ、残念ながら、このうちのいくつかは手作業でやらなければならないでしょう。 しかし、これはすべてpsqlのようなものから行うことができます。 最初のコマンドはとても簡単です。
select * into newtable from oldtable
これはoldtableのデータでnewtableを作成しますが、インデックスを作成しません。 その後、インデックスやシーケンスなどを自分で作成する必要があります。 コマンドでテーブル上のすべてのインデックスのリストを得ることができます。
select indexdef from pg_indexes where tablename='oldtable';
それから psql -E を実行してデータベースにアクセスし、古いテーブルを見るために \d を使用します。 そして、この2つのクエリを組み合わせて、配列の情報を取得することができます。
SELECT c.oid,
n.nspname,
c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~ '^(oldtable)$'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3;
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod),
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
a.attnotnull, a.attnum
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = '74359' AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum;
上の74359を前のクエリで取得したoidに置き換えてください。
関連
-
windows mysql prompt access denied for user ''@'localhost' to database.
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] SQLのインデックスとは何ですか?
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?