পোস্টগ্রেএসকিউএল-তে কোনও বিদ্যমান টেবিলটিতে কীভাবে একটি স্বয়ং-বৃদ্ধিকারী প্রাথমিক কী যুক্ত করবেন?


190

আমার বিদ্যমান ডাটা সহ একটি টেবিল আছে। টেবিলটি মোছা এবং পুনরায় তৈরি না করে প্রাথমিক কী যুক্ত করার কোনও উপায় আছে?

উত্তর:


354

( আপডেট - মন্তব্য করা লোকদের ধন্যবাদ )

PostgreSQL এর আধুনিক সংস্করণ

ধরুন আপনার নামের একটি সারণী রয়েছে test1, যার কাছে আপনি একটি স্বয়ং-বর্ধনকারী, প্রাথমিক-কী id(সারোগেট) কলাম যুক্ত করতে চান। পোস্টগ্র্রেএসকিউএল এর সাম্প্রতিক সংস্করণগুলিতে নিম্নলিখিত কমান্ডটি পর্যাপ্ত হতে হবে:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

PostgreSQL এর পুরানো সংস্করণ

PostgreSQL এর পুরানো সংস্করণগুলিতে (8.x এর পূর্বে?) আপনাকে সমস্ত নোংরা কাজ করতে হয়েছিল। নিম্নলিখিত আদেশের ক্রমটি কৌশলটি করা উচিত:

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

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


3
আমি ORACLE ব্যবহার করছি, সুতরাং এটি ভাগ করা ORACLE- এ ORACLE ছেলেদের পক্ষে দরকারী হতে পারে: ALTER TABLE TEST1 ID ID যোগ করুন; TEST1 SET ID = TEST1_SEQ.NEXTVAL আপডেট করুন; টেবিল টেস্ট 1 প্রাথমিক কী (আইডি) যুক্ত করুন; আপডেটের বিবৃতি কার্যকর করার আগে সিকোয়েন্স TEST1_SEQ তৈরি করুন
মিসবিউভা

নোট করুন যেটি প্রত্যাশিত ও চেয়েছিল হিসাবে ADD PRIMARY KEYএকটি NOT NULLসীমাবদ্ধতা তৈরি করেছে (9.3 পোস্টগ্রেসে পরীক্ষিত)।
জারেড বেক

19
পোস্টগ্রিসে আপনি একক কমান্ড ব্যবহার করতে পারেনALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
রেজিনিয়ানস্কি

1
@ রেসন্যান্সকি'র মন্তব্যে আরও, টেবিলে ডেটা থাকলেও এটি কাজ করবে। আইডিগুলি জনবহুল হয় এবং নাল নয় বাধা সেট করা হয়। সম্পূর্ণ মন্তব্যে লাইনটি দ্বারা প্রতিস্থাপন করা যেতে পারে।
সেনেসো 4'15

1
@ এরিকওয়াং ধন্যবাদ, এরিক, আপনি ঠিক বলেছেন - আমি বিশ্বাস করি যে এটি কয়েক বছর আগে (সংস্করণ) কাজ করে নি, তবে আমি নিশ্চিত নই। উত্তরটি সম্প্রদায়-উইকে পরিণত হয়েছে।
লিওনব্লায়

57
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

আপনার যা প্রয়োজন তা হ'ল:

  1. যোগ idকলাম
  2. এটি 1 থেকে গণনা (*) পর্যন্ত একটি ক্রম সহ পপুলেশন করুন।
  3. এটিকে প্রাথমিক কী হিসাবে নির্ধারণ করুন / নাল নয়।

ক্রেডিট দেওয়া হয়েছে @resnyanskiy যিনি একটি মন্তব্যে এই উত্তর দিয়েছেন।


2
এটি উত্তর হিসাবে চিহ্নিত করা উচিত, এবং উত্তরটি @resnyanskiy এর অন্তর্ভুক্ত থাকতে হবে
এরিক ওয়াং

আমাকে প্রথমে পিকেটি ফেলে দিতে হয়েছিল এবং পরে এটি চালাতে হয়েছিল। ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
জোশ রবার্টসন

10

V10 এ একটি পরিচয় কলাম ব্যবহার করতে,

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;

পরিচয় কলামগুলির ব্যাখ্যার জন্য, https://blog.2ndquadrant.com/postgresql-10-identity-col الm/ দেখুন ।

উত্সাহ এবং জেনারেটেড সর্বদা জেনারেটেডের মধ্যে পার্থক্যের জন্য, https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ দেখুন

ক্রম পরিবর্তন করার জন্য, https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ দেখুন


এই সমাধানটির সমস্যাটি হ'ল যদি টেবিলটিতে ইতিমধ্যে সারি থাকে তবে আপনি একটি ত্রুটি পান:SQL Error [23502]: ERROR: column "id" contains null values
ইস্পির

3
@ আইসাপির: প্রারম্ভিক সংস্করণগুলিতে একটি ত্রুটি ছিল (পিগ 10 এবং 10.1) এই ত্রুটিটি তৈরি করে। এটি পৃষ্ঠা 10.2 দিয়ে স্থির করা হয়েছিল। বিশদগুলি
এরউইন ব্র্যান্ডসেটেটার

ধন্যবাদ @ ইরভিন-ব্র্যান্ডসেট্টর
ইস্পির

এক বছর পরে আমি এই উত্তরটি আবার খুঁজে পেলাম, বাগটি আপাতদৃষ্টিতে সংশোধন করা হয়েছে,
উন্নীত করা হয়েছে

2

আমি এখানে অবতরণ করেছি কারণ আমিও এরকম কিছু খুঁজছিলাম। আমার ক্ষেত্রে, আমি লক্ষ্য টেবিলটিতে সারি আইডির নির্ধারণের সময় অনেকগুলি কলাম সহ স্টেজিং টেবিলের একটি সেট থেকে ডেটা অনুলিপি করছিলাম। উপরোক্ত পদ্ধতির একটি বৈকল্পিক যা আমি ব্যবহার করেছি। আমি আমার লক্ষ্য সারণির শেষে সিরিয়াল কলামটি যুক্ত করেছি। এইভাবে সন্নিবেশ বিবৃতিতে এর জন্য আমার কাছে কোনও স্থানধারক লাগবে না। তারপরে লক্ষ্য টেবিলের একটি সাধারণ নির্বাচন * স্বয়ংক্রিয়ভাবে এই কলামটিকে জনপ্রিয় করে তুলেছে। এখানে পোস্টগ্র্রেএসকিউএল 9.6.4 এ আমি দুটি এসকিউএল বিবৃতি ব্যবহার করেছি।

ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.