পোস্টগ্রিসে একটি সারণী (সূচিপত্র সহ) অনুলিপি করুন


85

আমার একটা পোস্টগ্রিস টেবিল আছে আমার এটি থেকে কিছু ডেটা মুছতে হবে। আমি একটি অস্থায়ী টেবিল তৈরি করতে যাচ্ছিলাম, ডেটা অনুলিপি করতে, সূচিগুলি পুনরায় তৈরি এবং আমার সারিগুলি মুছুন। আমি মূল টেবিল থেকে ডেটা মুছতে পারি না, কারণ এই আসল টেবিলটি ডেটার উত্স। এক ক্ষেত্রে আমার কিছু ফলাফল পেতে হবে যা এক্স মুছে ফেলার উপর নির্ভর করে, অন্য ক্ষেত্রে, আমার ওয়াই মুছে ফেলতে হবে So সুতরাং সর্বদা এবং উপলভ্য থাকার জন্য আমার সমস্ত মূল ডেটা দরকার।

তবে টেবিলটি পুনরায় তৈরি করা এবং এটি আবার অনুলিপি করা এবং সূচিগুলি পুনরায় তৈরি করা কিছুটা নির্বোধ বলে মনে হচ্ছে। পোস্টগ্রিসে কি এখনও এটি বলা আছে "আমি কাঠামো, ডেটা এবং সূচী সহ এই টেবিলের সম্পূর্ণ পৃথক অনুলিপি চাই"?

দুর্ভাগ্যক্রমে পোস্টগ্রাএসকিউএলএর "ক্রিয়েট টেবিল নেই .. পছন্দ মতো এক্স ইনডেক্সিং ইনডেক্সস '

উত্তর:


108

নতুন পোস্টগ্র্যাসকিউএল (ডক্স অনুসারে 8.3 সাল থেকে) "অন্তর্ভুক্ত সূচকগুলি" ব্যবহার করতে পারে:

# select version();
                                             version
-------------------------------------------------------------------------------------------------
 PostgreSQL 8.3.7 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
(1 row)

আপনি দেখতে পাচ্ছেন যে আমি 8.3 তে পরীক্ষা করছি।

এখন, টেবিল তৈরি করা যাক:

# create table x1 (id serial primary key, x text unique);
NOTICE:  CREATE TABLE will create implicit sequence "x1_id_seq" for serial column "x1.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x1_pkey" for table "x1"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "x1_x_key" for table "x1"
CREATE TABLE

এবং এটি দেখতে কেমন তা দেখুন:

# \d x1
                         Table "public.x1"
 Column |  Type   |                    Modifiers
--------+---------+-------------------------------------------------
 id     | integer | not null default nextval('x1_id_seq'::regclass)
 x      | text    |
Indexes:
    "x1_pkey" PRIMARY KEY, btree (id)
    "x1_x_key" UNIQUE, btree (x)

এখন আমরা কাঠামোটি অনুলিপি করতে পারি:

# create table x2 ( like x1 INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES );
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x2_pkey" for table "x2"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "x2_x_key" for table "x2"
CREATE TABLE

এবং কাঠামোটি পরীক্ষা করুন:

# \d x2
                         Table "public.x2"
 Column |  Type   |                    Modifiers
--------+---------+-------------------------------------------------
 id     | integer | not null default nextval('x1_id_seq'::regclass)
 x      | text    |
Indexes:
    "x2_pkey" PRIMARY KEY, btree (id)
    "x2_x_key" UNIQUE, btree (x)

আপনি যদি পোস্টগ্রিজ এসকিউএল প্রি -8.3 ব্যবহার করে থাকেন তবে আপনি 1-টেবিল নির্দিষ্ট করতে ডাম্পের মধ্যে টেবিলের নাম পরিবর্তন করতে এবং আবার লোড করতে বিকল্প "-t" বিকল্পের সাহায্যে pg_dump ব্যবহার করতে পারেন:

=> pg_dump -t x2 | sed 's/x2/x3/g' | psql
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE

এবং এখন টেবিলটি হ'ল:

# \d x3
                         Table "public.x3"
 Column |  Type   |                    Modifiers
--------+---------+-------------------------------------------------
 id     | integer | not null default nextval('x1_id_seq'::regclass)
 x      | text    |
Indexes:
    "x3_pkey" PRIMARY KEY, btree (id)
    "x3_x_key" UNIQUE, btree (x)

14
এইভাবে দুটি মূল টেবিলের মধ্যে প্রাথমিক কী সিকোয়েন্স (x1_id_seq) ভাগ করা হবে!
জৌজিকা

4
ওপস, pg9.X সহ, "মূল অন্তর্ভুক্তকরণগুলি" ("অন্তর্ভুক্ত সূচকগুলি" নয়) ব্যবহার করার সময় প্রাথমিক কী সিকোয়েন্সটি ভাগ করা হবে।
পিটার ক্রাউস

44
[CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    AS query][1]  

এখানে একটি উদাহরণ

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

প্রথম থেকে একটি নতুন টেবিল তৈরির অন্য উপায়টি হ'ল ব্যবহার করা

    CREATE TABLE films_recent (LIKE films INCLUDING INDEXES);  

    INSERT INTO films_recent
         SELECT *
           FROM books
          WHERE date_prod >= '2002-01-01';  

নোট করুন যে দ্বিতীয় পদ্ধতিটি ব্যবহার করা হলে পোস্টগ্রেস্কেলের টেবিলস্পেসের সমস্যাগুলি সমাধান করার জন্য একটি প্যাচ আউট রয়েছে


পোস্টগ্রাগে কোনও "ইনক্লুডিং সূচক" নেই।
ররি 11

4
আপনি কোন সংস্করণ ব্যবহার করছেন? সর্বশেষতম ডকটি পড়ুন, এটি সেখানে রয়েছে
ওল্ফম্যানড্রেগন

6
pg9.X এর সাথে, "অন্তর্ভুক্ত চুক্তিগুলি" ব্যবহার করার সময় ("অন্তর্ভুক্ত সূচকগুলি" নয়) প্রাথমিক কী ক্রম দুটি সারণির (!) এর মধ্যে ভাগ করা হবে।
পিটার ক্রাউস

দেখে মনে হচ্ছে এটি কাজ করার CREATE TABLE my_table (LIKE...)পরিবর্তে হওয়া দরকার CREATE TABLE my_table LIKE...। সম্পাদিত উত্তর।
জেসন সোয়েট

@ পিটারক্রস আপনি কি ভাগ করা প্রাথমিক কী সিকোয়েন্স জিনিসটি আবিষ্কার করতে পেরেছেন? আমি একটি নতুন টেবিলের মধ্যে একগুচ্ছ ডেটা কপি করার চেষ্টা করছি। আমি পুরানো টেবিলটি ফেলে দিতে পারি এবং নতুনটির নতুন নামকরণ করতে পারি না কারণ পুরানোটির নতুন পয়েন্ট থেকে pk।
yllottyellott

5

ওয়েবে অনেক উত্তর রয়েছে, এর একটি এখানে পাওয়া যাবে

আমি এরকম কিছু করে শেষ করেছি:

create table NEW ( like ORIGINAL including all);
insert into NEW select * from ORIGINAL

এটি স্কিমা এবং সূচিপত্র সহ ডেটা অনুলিপি করবে, তবে ট্রিগার এবং সীমাবদ্ধতাগুলি সহ নয়। নোট করুন যে সূচিগুলি মূল টেবিলের সাথে ভাগ করা হয়েছে তাই যখন কোনও সারণীতে নতুন সারি যুক্ত করা হয় তখন কাউন্টারটি বাড়বে।


4

আমার একটা পোস্টগ্রিস টেবিল আছে আমার এটি থেকে কিছু ডেটা মুছতে হবে।

আমার ধারণা যে ...

delete from yourtable
where <condition(s)>

... কোন কারণে কাজ করবে না। (এই কারণটি শেয়ার করার যত্ন?)

আমি একটি অস্থায়ী টেবিল তৈরি করতে যাচ্ছিলাম, ডেটা অনুলিপি করতে, সূচিগুলি পুনরায় তৈরি করতে এবং আমার সারিগুলি সরিয়ে ফেলতে চাই।

Pg_dump এবং pg_restore দেখুন। কিছু চালাক বিকল্পের সাথে পিজি_ডাম্প ব্যবহার করা এবং সম্ভবত পিজি_রেস্টরিংয়ের আগে আউটপুট সম্পাদনা করা কৌশলটি করতে পারে।


যেহেতু আপনি "কী যদি" ​​-তাই ডাটা উপর বিশ্লেষণ টাইপ করছেন, আমি ভাবছি আপনি যদি ভিউ ব্যবহার না করে আরও ভাল হন।

আপনি যা বাদ দিতে চান তা প্রত্যাখ্যানের ভিত্তিতে আপনি পরীক্ষা করতে চান এমন প্রতিটি দৃশ্যের জন্য একটি দৃশ্যের সংজ্ঞা দিতে পারেন। উদাহরণস্বরূপ, আপনি কী অন্তর্ভুক্ত করতে চান তার উপর ভিত্তি করে একটি দৃশ্যের সংজ্ঞা দিন। উদাহরণস্বরূপ, আপনি যদি ডেটাতে একটি "উইন্ডো" চান যেখানে আপনি এক্স = ওয়াই যেখানে সারিগুলি "মুছে ফেলেছেন", তবে আপনি যেখানে সারণি হিসাবে একটি দর্শন তৈরি করবেন (এক্স! = ওয়াই)।

ভিউগুলি তাদের সংজ্ঞায়িত ক্যোয়ারী হিসাবে ডাটাবেসে (সিস্টেম ক্যাটালগে) সংরক্ষণ করা হয়। প্রতিবার আপনি দেখার ক্যোয়ারিতে ডাটাবেস সার্ভারটি অন্তর্নিহিত কোয়েরিটি অনুসন্ধান করে যা এটি সংজ্ঞায়িত করে এবং এটি কার্যকর করে (আপনি যে কোনও অন্য শর্ত ব্যবহার করেছেন)। এই পদ্ধতির বিভিন্ন সুবিধা রয়েছে:

  1. আপনি কখনই আপনার ডেটার কোনও অংশ নকল করবেন না।
  2. বেস টেবিলের জন্য ইতিমধ্যে ব্যবহৃত সূচকগুলি (আপনার আসল, "আসল" টেবিল) ব্যবহার করা হবে (ক্যোয়ারী অপ্টিমাইজারের হিসাবে উপযুক্ত হিসাবে দেখা যাবে) যখন আপনি প্রতিটি দর্শন / দৃশ্যের প্রশ্ন করবেন। সেগুলি নতুন করে সংজ্ঞায়িত বা অনুলিপি করার দরকার নেই।
  3. যেহেতু বেস টেবিলের "আসল" ডেটাতে একটি ভিউ একটি "উইন্ডো" (কোনও শাপশট নয়), তাই আপনি আপনার বেস টেবিলটিতে যোগ / আপডেট / মুছতে পারেন এবং কোনও দৃশ্য পুনরায় তৈরি করার প্রয়োজন নেই এমন দৃশ্যের দৃশ্যপটগুলি পুনরায় প্রশ্ন করতে পারেন সময়ের সাথে সাথে ডেটা পরিবর্তন হয়।

অবশ্যই একটি বাণিজ্য বন্ধ আছে। যেহেতু একটি দৃশ্য ভার্চুয়াল টেবিল এবং "আসল" (বেস) সারণী নয়, আপনি প্রতিবার এটি অ্যাক্সেস করার সাথে সাথে একটি (সম্ভবত জটিল) কোয়েরিটি কার্যকর করছেন। এটি কিছুটা কমিয়ে দিতে পারে slow তবে তা নাও পারে। এটি অনেকগুলি সমস্যার উপর নির্ভর করে (ডেটার আকার এবং প্রকৃতি, সিস্টেম ক্যাটালগের পরিসংখ্যানের গুণমান, হার্ডওয়্যারের গতি, ব্যবহারের বোঝা এবং আরও অনেক কিছু)। আপনি চেষ্টা না করা পর্যন্ত আপনি জানতে পারবেন না। যদি (এবং কেবলমাত্র) আপনি যদি দেখতে পান যে পারফরম্যান্সটি অগ্রহণযোগ্যভাবে ধীর হয়েছে, তবে আপনি অন্যান্য বিকল্পগুলির দিকে নজর দিতে পারেন। (বাস্তবায়িত দর্শন, টেবিলের অনুলিপি, ... যে কোনও কিছু যা সময়ের জন্য স্থানের ব্যবসা করে))


আমি কেন আসল টেবিল থেকে কেবল মুছতে পারি না তা ব্যাখ্যা করার জন্য আমি প্রশ্নটি আপডেট করেছি
ররি

1

আপনি চান ডেটা দখল করতে একটি নির্বাচন ব্যবহার করে একটি নতুন টেবিল তৈরি করুন। তারপরে নতুনটি দিয়ে পুরানো টেবিলটি অদলবদল করুন।

create table mynewone as select * from myoldone where ...
mess (re-create) with indexes after the table swap.

0

একটি সহজ উপায় সমস্ত অন্তর্ভুক্ত:

CREATE TABLE new_table (LIKE original_table INCLUDING ALL);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.