পোস্টগ্রিএসকিউএল ডাটাবেস টেবিলের কলামের অবস্থান কীভাবে আমি পরিবর্তন করব?


112

আমি নিম্নলিখিত চেষ্টা করেছিলাম, কিন্তু আমি ব্যর্থ হয়েছিল:

ALTER TABLE person ALTER COLUMN dob POSITION 37;

6
এই প্রশ্নের আগে
টমেটজকি

উত্তর:


106

" ভুঁইয়া কলাম অবস্থান " পোস্টগ্রি উইকি বলেছেন:

পোস্টগ্রাইএসকিউএল বর্তমানে সারণীর attnumকলামের উপর ভিত্তি করে কলাম ক্রম সংজ্ঞায়িত করে pg_attribute। কলামের ক্রম পরিবর্তন করার একমাত্র উপায় হ'ল হয় সারণীটি পুনরায় তৈরি করা বা কলামগুলি যুক্ত করা এবং ডেটা ঘোরানো দ্বারা আপনি পছন্দসই বিন্যাসে পৌঁছা পর্যন্ত।

এটি বেশ দুর্বল, তবে তাদের প্রতিরক্ষা হিসাবে, স্ট্যান্ডার্ড এসকিউএল-তে, কোনও কলামই স্থান দেওয়ার কোনও সমাধান নেই। ডাটাবেস ব্র্যান্ডগুলি যে কোনও কলামের অর্ডিনাল অবস্থান পরিবর্তন করতে সমর্থন করে এসকিউএল সিনট্যাক্সে একটি এক্সটেনশনকে সংজ্ঞায়িত করছে।

আমার কাছে অন্য একটি ধারণা আসে: আপনি VIEWবেস সারণীতে কলামের শারীরিক অবস্থান পরিবর্তন না করে এমন কোনও সংজ্ঞা দিতে পারেন যা আপনার পছন্দমতো কলামগুলির ক্রম নির্দিষ্ট করে।


3
@ ডানা: আমি মনে করি উইকি নিবন্ধে "টেবিলটি পুনরুদ্ধার" দ্বারা এটি বোঝানো হয়েছে
বিল কারভিন

2
'ডাটাবেস ফেলে দিন' :: ডেটা ক্ষতিগ্রস্থ করার দুর্দান্ত উপায়। এবং তাই "বিশাল ডাটাবেস স্ক্রাব" প্রভাব।
কেন্ট ফ্রেড্রিক

31
@ কেন্ট: সন্দেহজনক, পোস্টগ্রিস ডেটাগুলির ধারাবাহিকতা নিশ্চিত করতে অনেক এগিয়ে গেছে এবং এটি অবশ্যই পিজি_ডাম্পের জন্য প্রযোজ্য। সর্বোপরি, পুনরুদ্ধারটি যদি উদাস হয় তবে ডিবি ব্যাকআপ করার কী লাভ?
দানা দ্য সনে

@ দানা, হ্যাঁ, তবে আপনি 1) ডাম্প করার জন্য একটি বড় প্রক্রিয়া যুক্ত করছেন, এবং তারপরে আপনি নেমে যাবেন এবং তারপরে আপনার একটি বড় সময় ব্যয় করা ভার হবে। আপনার যদি গুরুতরভাবে বিশাল ডেটাবেস থাকে যা সাধারণত 37 টি কলামের ক্ষেত্রে হয় তবে আপনার ডিস্ক আইও দম বন্ধ হওয়ার ঝুঁকি রয়েছে।
কেন্ট ফ্রেড্রিক

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

36

PostgreSQL এ, ক্ষেত্র যোগ করার সময় এটি টেবিলের শেষে যুক্ত করা হবে। আমাদের যদি তখন কোনও নির্দিষ্ট অবস্থানে intoোকানো দরকার

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;

3
বাহ এটা দুর্দান্ত, আমি নিশ্চিত এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
টমমাসো থিয়া সিওনি

হ্যাঁ, এটি সত্যিই সহায়ক, অনেক ধন্যবাদ!
আকুনা

আপনি বর্তমানের টেবিলটি এটির মতো কোনও নতুন পুরানো টেবিলটিতে অনুলিপি করতে পারেন: টেবিলের নাম নির্বাচন করুন; যেমন টেবিলের নাম থেকে নির্বাচন করুন;
রায়ান

29

এই পোস্টটি পুরানো এবং সম্ভবত সমাধান হয়েছে তবে আমার একই সমস্যা ছিল। আমি নতুন কলামের ক্রম নির্দিষ্ট করে মূল টেবিলের একটি ভিউ তৈরি করে এটি সমাধান করেছি।

এখান থেকে আমি হয় ভিউটি ব্যবহার করতে বা ভিউ থেকে একটি নতুন টেবিল তৈরি করতে পারি।

    আসল_ট্যাব_উডাব্লু এএস তৈরি করুন
    A.col1, a.col3, a.col4, a.col2 নির্বাচন করুন
    অরিজিনাল_ট্যাব এ
    যেখানে a.col1 নন ​​- বা যাই হোক না কেন
    আসল_ট্যাব_ভিডাব্লু থেকে নতুন_সামগ্রী নির্বাচন করুন *

আসল টেবিলটির নতুন নাম বা ড্রপ করুন এবং নতুন টেবিলের নামটি পুরানো টেবিলটিতে সেট করুন।


2
এটি দেখতে বেশ যুক্তিসঙ্গত সমাধান বলে মনে হচ্ছে। এটি খুব খারাপ যে এই প্রক্রিয়াটি স্বয়ংক্রিয় করার জন্য কোনও জিইউআই সরঞ্জাম নেই।
কোলোনেল প্রশ্ন

4
ভাল সমাধান তবে কেবলমাত্র ডেটা ধরণের অনুলিপি করা হয় (প্রাথমিক কী নেই ইত্যাদি)
Regisz

1
বিকল্পভাবে - কেবল পুনরায় সাজানো কলামগুলির সাথে দর্শনটি ব্যবহার করুন। সর্বনিম্ন কর্মক্ষমতা হ্রাস হওয়া উচিত।
pscl

1
এটিই সেরা সমাধান।
নিকোলে শিন্দারভ

23

প্রথমত, কলামের আদেশটি একেবারে পরিবর্তন করতে হবে এবং বিদেশী কীগুলি ব্যবহার করার সময়, কলামগুলি পুনরায় সাজানোর জন্য একটি আনাড়ি বিকল্পটি হ'ল প্রথমে ডেটা সহ পুরো ডাটাবেসটি ডাম্প করা, তারপরে কেবল স্কিমা ( pg_dump -s databasename > databasename_schema.sql) ডাম্প করা । আপনার পছন্দমতো কলামগুলি পুনরায় সাজানোর জন্য স্কিমা ফাইলটি সম্পাদনা করুন, তারপরে স্কিমা থেকে ডাটাবেসটি পুনরায় তৈরি করুন এবং শেষ পর্যন্ত নতুন তৈরি ডাটাবেসে ডেটা পুনরুদ্ধার করুন।


1
কেন ডাউনটা? গৃহীত উত্তরটি যেমন পোস্টগ্র্রেএসকিউএল উইকিকে উদ্ধৃত করে উল্লেখ করেছে: column কলাম ক্রম পরিবর্তন করার একমাত্র উপায় হ'ল হয় সারণিটি পুনরায় তৈরি করা, অথবা কলাম যুক্ত করে এবং তথ্য পছন্দসই আকারে ঘোরানো যতক্ষণ না আপনি পছন্দসই বিন্যাসে পৌঁছান » এই সমাধানটি সর্বোত্তম নয় (এই উত্তরগুলির কোনওটিই কার্য সম্পাদনের জন্য অন্তর্নির্মিত অপারেশনের অভাবে নয়) তবে এটি একটি সারণীতে কলামগুলি পুনরায় সাজানোর কোনও উপায় সরবরাহ করে।
ভিল

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

3
আসলে, টেবিলটি অন্য টেবিলে বিদেশী কী হলে এটি খুব ভাল সমাধান good অন্য সমস্ত সমাধান এই প্রাক্কালে কাজ করে না। শেষ অবধি, pg_dump - কলাম-সন্নিবেশ -s ডাটাবেস> ডাটাবেস_সেমি.এসকিএল
আলেজান্দ্রো সালামানকা মাজুলো

9

আপনি বর্তমানে করতে পারবেন বলে আমি মনে করি না: পোস্টগ্র্যাস্কিল উইকিতে এই নিবন্ধটি দেখুন ।

এই নিবন্ধটি থেকে তিনটি কার্যকারণ হ'ল:

  1. টেবিলটি পুনরায় তৈরি করুন
  2. কলাম যুক্ত করুন এবং ডেটা সরান
  3. একটি মতামত দিয়ে পার্থক্য লুকান।

5

পিজিএডমিনে এবং নীচে এসকিউএল ফলকে সারণীটি খুলুন এসকিউএল তৈরি সারণী বিবৃতিটি অনুলিপি করুন। তারপরে কোয়েরি টুলটি খুলুন এবং পেস্ট করুন। যদি টেবিলের ডেটা থাকে তবে টেবিলের নামটি 'নতুন_নাম' করুন, না থাকলে ড্রপ টেবিল লাইনের মন্তব্য "-" মুছুন। প্রয়োজনীয় হিসাবে কলাম ক্রম সম্পাদনা করুন। আপনি যদি সরিয়ে নিয়ে থাকেন তবে সর্বশেষ কলামে অনুপস্থিত / অতিমাত্রায় কমা মনে করুন। নতুন এসকিউএল তৈরি সারণী কমান্ড কার্যকর করুন। রিফ্রেশ এবং ...

ডিজাইনের পর্যায়ে খালি টেবিলগুলির জন্য এই পদ্ধতিটি বেশ ব্যবহারিক।

সারণীতে ডেটা থাকলে, আমাদেরও তথ্যের কলাম ক্রমটি পুনরায় সাজানো দরকার। এটি সহজ: INSERTপুরানো টেবিলটি এর নতুন সংস্করণে এর সাথে আমদানি করতে ব্যবহার করুন :

INSERT INTO new ( c2, c3, c1 ) SELECT * from old;

... যেখানে c2, c3, c1কলাম হয় c1, c2, c3তাদের নতুন অবস্থানকে পুরাতন টেবিলের। দয়া করে নোট করুন যে এক্ষেত্রে আপনাকে সম্পাদিত 'পুরানো' টেবিলের জন্য অবশ্যই একটি 'নতুন' নাম ব্যবহার করা উচিত , বা আপনি আপনার ডেটা হারাবেন । যদি কলামের নামগুলি অনেক, দীর্ঘ এবং / অথবা জটিল নতুন টেবিল কাঠামোটিকে একটি পাঠ্য সম্পাদকের অনুলিপি করতে এবং উপরের মত একই পদ্ধতি ব্যবহার করে INSERTবিবৃতিতে অনুলিপি করার আগে সেখানে নতুন কলাম তালিকা তৈরি করে ।

সব ঠিক আছে কিনা তা যাচাই করার পরে, DROPপুরানো টেবিলটি ব্যবহার করে 'নতুন' নামটি পরিবর্তন করে 'পুরানো' করে দিন ALTER TABLE new RENAME TO old;এবং আপনার কাজ শেষ হয়েছে।


1

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

  1. থেকে টেবিল তৈরি এসকিউএল পায় ets pg_dump
  2. ডাম্প থেকে সমস্ত উপলব্ধ কলাম পান
  3. কলামগুলি কাঙ্ক্ষিত ক্রমে রাখে
  4. pg_dumpডেটা সহ একটি পুনঃ-অর্ডার সারণী তৈরি করতে মূল ক্যোয়ারীটি পরিবর্তন করে
  5. পুরানো টেবিল ফোঁটা
  6. পুরানো সারণির সাথে মেলে নতুন টেবিলটির নামকরণ

এটি নিম্নলিখিত সাধারণ কমান্ডটি ব্যবহার করে ব্যবহার করা যেতে পারে:

./reorder.py -n schema -d database table \
    first_col second_col ... penultimate_col ultimate_col --migrate

এটি স্কুয়েলটি প্রিন্ট করে যাতে আপনি এটি যাচাই করতে এবং পরীক্ষা করতে পারেন, এটি আমি এটি ভিত্তিক একটি বড় কারণ ছিল pg_dump। আপনি গিথুব রেপোটি এখানে পাবেন


0

আমি জ্যাঙ্গো ব্যবহার করি এবং যদি আপনি মাথা ব্যাথা না করতে চান তবে এটি প্রতিটি টেবিলের আইডি কলামের প্রয়োজন। দুর্ভাগ্যক্রমে, আমি অসাবধান ছিলাম এবং আমার টেবিল bp.geo_location_v লীগ এ এই ক্ষেত্রটি ধারণ করে নি। আমি ছোট কৌশল শুরু। ধাপ 1:

CREATE VIEW bp.geo_location_vague_vw AS
    SELECT 
        a.id, -- I change order of id column here. 
        a.in_date,
        etc
    FROM bp.geo_location_vague a

পদক্ষেপ 2: (টেবিল তৈরি না করে - টেবিলটি স্বয়ংক্রিয়তা তৈরি করবে!)

SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw

ধাপ 3:

CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;

কারণ আমার টেবিলে বিগসিরিয়াল সিউডোটাইপ থাকা দরকার। সিলেক্ট * এর পরে পিজি বিগিন্ট টাইপ ইনসেটেড বিগসিরিয়াল তৈরি করবে।

পদক্ষেপ 4: এখন আমরা ভিউটি ড্রপ করতে পারি, উত্স টেবিলটি ড্রপ করতে এবং পুরানো নামে নতুন টেবিলটির নতুন নামকরণ করতে পারি। কৌশলটি সফলভাবে শেষ হয়েছিল।


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