আমি নিম্নলিখিত চেষ্টা করেছিলাম, কিন্তু আমি ব্যর্থ হয়েছিল:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
আমি নিম্নলিখিত চেষ্টা করেছিলাম, কিন্তু আমি ব্যর্থ হয়েছিল:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
উত্তর:
" ভুঁইয়া কলাম অবস্থান " পোস্টগ্রি উইকি বলেছেন:
পোস্টগ্রাইএসকিউএল বর্তমানে সারণীর
attnum
কলামের উপর ভিত্তি করে কলাম ক্রম সংজ্ঞায়িত করেpg_attribute
। কলামের ক্রম পরিবর্তন করার একমাত্র উপায় হ'ল হয় সারণীটি পুনরায় তৈরি করা বা কলামগুলি যুক্ত করা এবং ডেটা ঘোরানো দ্বারা আপনি পছন্দসই বিন্যাসে পৌঁছা পর্যন্ত।
এটি বেশ দুর্বল, তবে তাদের প্রতিরক্ষা হিসাবে, স্ট্যান্ডার্ড এসকিউএল-তে, কোনও কলামই স্থান দেওয়ার কোনও সমাধান নেই। ডাটাবেস ব্র্যান্ডগুলি যে কোনও কলামের অর্ডিনাল অবস্থান পরিবর্তন করতে সমর্থন করে এসকিউএল সিনট্যাক্সে একটি এক্সটেনশনকে সংজ্ঞায়িত করছে।
আমার কাছে অন্য একটি ধারণা আসে: আপনি VIEW
বেস সারণীতে কলামের শারীরিক অবস্থান পরিবর্তন না করে এমন কোনও সংজ্ঞা দিতে পারেন যা আপনার পছন্দমতো কলামগুলির ক্রম নির্দিষ্ট করে।
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;
এই পোস্টটি পুরানো এবং সম্ভবত সমাধান হয়েছে তবে আমার একই সমস্যা ছিল। আমি নতুন কলামের ক্রম নির্দিষ্ট করে মূল টেবিলের একটি ভিউ তৈরি করে এটি সমাধান করেছি।
এখান থেকে আমি হয় ভিউটি ব্যবহার করতে বা ভিউ থেকে একটি নতুন টেবিল তৈরি করতে পারি।
আসল_ট্যাব_উডাব্লু এএস তৈরি করুন A.col1, a.col3, a.col4, a.col2 নির্বাচন করুন অরিজিনাল_ট্যাব এ যেখানে a.col1 নন - বা যাই হোক না কেন
আসল_ট্যাব_ভিডাব্লু থেকে নতুন_সামগ্রী নির্বাচন করুন *
আসল টেবিলটির নতুন নাম বা ড্রপ করুন এবং নতুন টেবিলের নামটি পুরানো টেবিলটিতে সেট করুন।
প্রথমত, কলামের আদেশটি একেবারে পরিবর্তন করতে হবে এবং বিদেশী কীগুলি ব্যবহার করার সময়, কলামগুলি পুনরায় সাজানোর জন্য একটি আনাড়ি বিকল্পটি হ'ল প্রথমে ডেটা সহ পুরো ডাটাবেসটি ডাম্প করা, তারপরে কেবল স্কিমা ( pg_dump -s databasename > databasename_schema.sql
) ডাম্প করা । আপনার পছন্দমতো কলামগুলি পুনরায় সাজানোর জন্য স্কিমা ফাইলটি সম্পাদনা করুন, তারপরে স্কিমা থেকে ডাটাবেসটি পুনরায় তৈরি করুন এবং শেষ পর্যন্ত নতুন তৈরি ডাটাবেসে ডেটা পুনরুদ্ধার করুন।
আপনি বর্তমানে করতে পারবেন বলে আমি মনে করি না: পোস্টগ্র্যাস্কিল উইকিতে এই নিবন্ধটি দেখুন ।
এই নিবন্ধটি থেকে তিনটি কার্যকারণ হ'ল:
পিজিএডমিনে এবং নীচে এসকিউএল ফলকে সারণীটি খুলুন এসকিউএল তৈরি সারণী বিবৃতিটি অনুলিপি করুন। তারপরে কোয়েরি টুলটি খুলুন এবং পেস্ট করুন। যদি টেবিলের ডেটা থাকে তবে টেবিলের নামটি 'নতুন_নাম' করুন, না থাকলে ড্রপ টেবিল লাইনের মন্তব্য "-" মুছুন। প্রয়োজনীয় হিসাবে কলাম ক্রম সম্পাদনা করুন। আপনি যদি সরিয়ে নিয়ে থাকেন তবে সর্বশেষ কলামে অনুপস্থিত / অতিমাত্রায় কমা মনে করুন। নতুন এসকিউএল তৈরি সারণী কমান্ড কার্যকর করুন। রিফ্রেশ এবং ...
ডিজাইনের পর্যায়ে খালি টেবিলগুলির জন্য এই পদ্ধতিটি বেশ ব্যবহারিক।
সারণীতে ডেটা থাকলে, আমাদেরও তথ্যের কলাম ক্রমটি পুনরায় সাজানো দরকার। এটি সহজ: INSERT
পুরানো টেবিলটি এর নতুন সংস্করণে এর সাথে আমদানি করতে ব্যবহার করুন :
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... যেখানে c2
, c3
, c1
কলাম হয় c1
, c2
, c3
তাদের নতুন অবস্থানকে পুরাতন টেবিলের। দয়া করে নোট করুন যে এক্ষেত্রে আপনাকে সম্পাদিত 'পুরানো' টেবিলের জন্য অবশ্যই একটি 'নতুন' নাম ব্যবহার করা উচিত , বা আপনি আপনার ডেটা হারাবেন । যদি কলামের নামগুলি অনেক, দীর্ঘ এবং / অথবা জটিল নতুন টেবিল কাঠামোটিকে একটি পাঠ্য সম্পাদকের অনুলিপি করতে এবং উপরের মত একই পদ্ধতি ব্যবহার করে INSERT
বিবৃতিতে অনুলিপি করার আগে সেখানে নতুন কলাম তালিকা তৈরি করে ।
সব ঠিক আছে কিনা তা যাচাই করার পরে, DROP
পুরানো টেবিলটি ব্যবহার করে 'নতুন' নামটি পরিবর্তন করে 'পুরানো' করে দিন ALTER TABLE new RENAME TO old;
এবং আপনার কাজ শেষ হয়েছে।
আমি প্রচুর টেবিলগুলি পুনরায় অর্ডার করার জন্য কাজ করছিলাম এবং একই প্রশ্নগুলি বার বার লিখতে চাইনি তাই আমার কাছে এটি করার জন্য আমি একটি স্ক্রিপ্ট তৈরি করেছিলাম। মূলত, এটি:
pg_dump
pg_dump
ডেটা সহ একটি পুনঃ-অর্ডার সারণী তৈরি করতে মূল ক্যোয়ারীটি পরিবর্তন করেএটি নিম্নলিখিত সাধারণ কমান্ডটি ব্যবহার করে ব্যবহার করা যেতে পারে:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
এটি স্কুয়েলটি প্রিন্ট করে যাতে আপনি এটি যাচাই করতে এবং পরীক্ষা করতে পারেন, এটি আমি এটি ভিত্তিক একটি বড় কারণ ছিল pg_dump
। আপনি গিথুব রেপোটি এখানে পাবেন ।
আমি জ্যাঙ্গো ব্যবহার করি এবং যদি আপনি মাথা ব্যাথা না করতে চান তবে এটি প্রতিটি টেবিলের আইডি কলামের প্রয়োজন। দুর্ভাগ্যক্রমে, আমি অসাবধান ছিলাম এবং আমার টেবিল 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: এখন আমরা ভিউটি ড্রপ করতে পারি, উত্স টেবিলটি ড্রপ করতে এবং পুরানো নামে নতুন টেবিলটির নতুন নামকরণ করতে পারি। কৌশলটি সফলভাবে শেষ হয়েছিল।
এটি সম্ভব করার জন্য কয়েকটি কার্যক্রম রয়েছে:
পুরো টেবিল পুনরায়
বর্তমান সারণীতে নতুন কলাম তৈরি করুন
একটি ভিউ তৈরি করুন