আমি কীভাবে কোনও পোস্টগ্র্যাস্কিল ডাটাবেসে কলাম যুক্ত করতে পারি যা শূন্যস্থানগুলিকে অনুমতি দেয় না?


243

আমি নিম্নলিখিত পোস্টটি (ইন্টারনেটের জন্য স্যানিটাইজড) ব্যবহার করে আমার পোস্টগ্র্যাস্কিল ডাটাবেসে একটি নতুন, "নট নুল" কলাম যুক্ত করছি:

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

প্রতিবার আমি এই ক্যোয়ারীটি চালাচ্ছি, আমি নিম্নলিখিত ত্রুটি বার্তাটি পেয়েছি:

ERROR:  column "mycolumn" contains null values

আমি স্ট্যাম্পড কোথায় আমি ভুল যাচ্ছি?

দ্রষ্টব্য: আমি pgAdmin III (1.8.4) প্রাথমিকভাবে ব্যবহার করছি তবে টার্মিনালের মধ্যে থেকে এসকিউএল চালানোর সময় আমি একই ত্রুটি পেয়েছি।

উত্তর:


400

আপনাকে একটি ডিফল্ট মান সেট করতে হবে।

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;

1
সুন্দর সমাধান। এর জন্য সিনট্যাক্সটি কী হবে তা দেখার জন্য আমি কোনও কারণে অনলাইন পোস্টগ্রিজ ডক্সে যেতে পারিনি।
শান উজ্জ্বল

4
@ সানব্রাইট, আপনি পোস্টগ্রাস ডকটিতে অফলাইনে অ্যাক্সেস করতে পারবেন man ALTER_TABLE :)
allan.simon

@ অ্যালান.সিমন আমি পোস্টগ্র্রেএসকিউএল এর আগে কখনও ব্যবহার করি নি এবং আমার এটি কোথাও ইনস্টল করা নেই।
শান উজ্জ্বল

2
স্পষ্ট করার জন্য: ডিফল্ট মানটি কেবল বিদ্যমান সারিগুলি আপডেট করার জন্য প্রয়োজন, যার কারণেই এটি তত্ক্ষণাত পরে বাদ দেওয়া যায়। সারণীটি পরিবর্তন করা হলে বিদ্যমান সমস্ত সারি আপডেট করা হয়েছে (এতে কিছুটা সময় লাগতে পারে, সম্ভবত)
এমএসএলটার্স

2
আপনি বিদ্যমান সারিগুলির প্রাথমিক মান গণনা করতে যদি অন্য কলামটি ব্যবহার করতে চান তবে এটি কাজ করবে না। j_random_hacker এর উত্তর এটির জন্য আরও মজবুত করে তোলে।
jpmc26

82

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

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;

7
এমনকি কোনও লেনদেনের মধ্যেও, তাত্ক্ষণিকভাবে নূলে প্রয়োগ করা হয় না, সুতরাং অবশ্যই প্রথমে কলাম যুক্ত করতে হবে, মানগুলি পূরণ করতে হবে, তারপরে নালটি যুক্ত করতে হবে না - যেমন এই উত্তরটি করে। (পোস্টগ্রাস 9.6 এ পরীক্ষিত)
বেনি চেরনিয়াভস্কি-পাসকিন

48

যেহেতু সারণি সারণীতে ইতিমধ্যে বিদ্যমান রয়েছে, ALTERবিবৃতিটি NULLবিদ্যমান সারিগুলির জন্য সদ্য নির্মিত কলামে sert োকানোর চেষ্টা করছে । আপনাকে অনুমতি হিসাবে কলামটি যুক্ত করতে হবে NULL, তারপরে আপনার যে মানগুলি চান সেগুলি দিয়ে কলামটি পূরণ করতে হবে এবং তারপরে এটি সেট করতে হবে NOT NULL


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

5

আপনি হয় একটি ডিফল্ট সংজ্ঞায়িত করতে হবে, বা শন যা বলে তা করা এবং এটি বিদ্যমান সারিগুলিতে পূরণ না করা পর্যন্ত শূন্য সীমাবদ্ধতা ছাড়াই এটি যুক্ত করতে হবে।


2

একটি ডিফল্ট মান নির্দিষ্ট করাও কাজ করবে, ধরে নিলে একটি ডিফল্ট মান উপযুক্ত।


2
এটি ডিফল্ট মান (উদাহরণস্বরূপ) সহ কলাম তৈরি করতে সংশোধিত বাক্য গঠন দেওয়ার উত্তরকে উন্নত করবে।
হার্ডম্যাথ

1

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

হ্যাঁ, এটি আরও জটিল, তবে আপনি যদি লাইভ টেবিলে কোনও বড় আপডেট না চান তবে আপনাকে এইভাবে এটি করার দরকার হতে পারে।


3
আমি আপনাকে -1 করিনি, তবে আমি মনে করি এটির সাথে সূক্ষ্ম অসুবিধা হতে পারে - যেমন আমি বাজি ধরেছি যে বিদ্যমান সূচকগুলি, ট্রিগারগুলি এবং মতামতগুলি পুনরায় নামকরণের পরেও মূল টেবিলটি উল্লেখ করতে থাকবে যেহেতু আমার মনে হয় তারা সঞ্চয় করে সারণীর নাম বাদ দিয়ে (যা পরিবর্তিত হয় না) রিলিড করুন।
j_random_hacker

1
হ্যাঁ, আমার বলা উচিত ছিল যে নতুন টেবিলটি মূল সূচীর একটি অনুলিপি হওয়া উচিত, সূচকগুলি যুক্ত করা সহ এবং এগুলি including খুব সংক্ষিপ্ত হওয়ার জন্য আমার খারাপ। এর কারণ হ'ল লাইব হতে পারে এমন কোনও টেবিলে একটি ALTER সম্পাদনের সূক্ষ্ম বিচ্ছিন্নতাও রয়েছে এবং কখনও কখনও আপনার এটি স্টেজ করা দরকার।
আলফাডোগ

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

যথাযথভাবে, অ্যালটার টেবিলে পোস্টগ্রিএসকিউএল ডক্স অনুসারে টেবিলটি লক করে দেওয়া হয়, তবে আপনার অ-লেনদেনের পদ্ধতির পরিবর্তনগুলি হারাতে ঝুঁকিপূর্ণ যদি টেবিলটি সত্যই লাইভ থাকে। এছাড়াও আমি পরামর্শ দিয়েছিলাম যে কলামের অর্ডারের উপর নির্ভর করে এমন কোনও কোড ভাঙা হয়েছে (এটি অবশ্যই আপনার নিয়ন্ত্রণের বাইরে হতে পারে)।
j_random_hacker

2
এই পদ্ধতিরটি বিশেষত সমস্যাযুক্ত যদি টেবিলটি বিদেশী কী সূচকগুলির দ্বারা উল্লেখ করা হয় তবে সেগুলিও আবার তৈরি করতে হবে।
আরেহ লেইব বৃষ

0

এই ক্যোয়ারী নালগুলি স্বয়ংক্রিয়ভাবে আপডেট করবে

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;

-6

এটি আমার পক্ষে কাজ করেছে: :)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;

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