একটি বিদ্যমান টেবিলের মধ্যে একটি নাল নয় কলাম columnোকান


121

আমি চেষ্টা করেছি:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

তবে এটি এই ত্রুটি বার্তা দেয়:

অল্টার টেবিলটি কেবল কলামগুলি যুক্ত করতে দেয় যা নালগুলি ধারণ করতে পারে বা একটি ডিফল্ট সংজ্ঞা নির্দিষ্ট করতে পারে

উত্তর:


221

একটি বিকল্প হিসাবে আপনি প্রাথমিকভাবে নাল-সক্ষম কলাম তৈরি করতে পারেন, তারপরে বৈধ নয় নাল মানগুলির সাথে আপনার টেবিল কলামটি আপডেট করুন এবং অবশেষে নাল নয় বাধা সেট করার জন্য ALTER কলামটি পরিবর্তন করুন:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

অন্য বিকল্পটি হ'ল আপনার কলামের জন্য সঠিক ডিফল্ট মান নির্দিষ্ট করা:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

ইউপিডি: দয়া করে নোট করুন যে উপরের উত্তরে এমনটি রয়েছে GOযা আপনি যখন মাইক্রোসফ্ট এসকিউএল সার্ভারে এই কোডটি চালাবেন তখন আবশ্যক। আপনি যদি ওরাকল বা মাইএসকিউএল তে একই ক্রিয়াকলাপ সম্পাদন করতে চান তবে আপনাকে সেমিকোলনটি এর ;মতো ব্যবহার করতে হবে :

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

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

1
@ অ্যাকারলন - আমি মনে করি এটি পৌঁছেছে। updateআপনার উল্লেখ করা বিপজ্জনক বক্তব্য যে কোনও প্রশ্নের পক্ষে ক্ষতিকারক হবে। updateএখানে বিবৃতিতে আপনার অতিরিক্ত কলাম রয়েছে কিনা তা দেখার জন্য এটি যথেষ্ট সহজ হওয়া উচিত । আপনি সাধারণত একবারে কেবল দুটি কলাম যুক্ত করবেন। updateউদাহরণস্বরূপ, আপনি যদি নিজের বিবৃতিতে কোনও অতিরিক্ত কলাম যুক্ত করেন না যা এই উদাহরণে নেই, তবে সম্ভবত আপনাকে প্রথমে ডেটার দায়িত্বে থাকা উচিত নয়।
ডাব্লু ডিকসন

1
SQLite ব্যবহার করে অ্যান্ড্রয়েড বিকাশকারীরা সচেতন হন যা ALTER COLUMNএসকিউএলাইটে সমর্থিত নয়।
এসডিঘেসেমি

2
আমি এর GOআগে কখনও দেখিনি এবং এটি এসকিউএল স্পেসিফিকেশনের একটি অংশ হিসাবে উপস্থিত হবে না বলে মনে হয় , সুতরাং এটি সম্ভবত যে কোনও সরঞ্জাম দ্বারা সমর্থন করে কোনও স্ক্রিপ্টগুলি কার্যকর না করে ব্যর্থতার দিকে পরিচালিত করবে। শুধু সেমিকোলন ব্যবহার করবেন? আমি মাইক্রোসফ্ট স্ট্যান্ডার্ডগুলি ছড়িয়ে দেওয়ার পরামর্শ দিচ্ছি না কারণ তারা কোনও প্রতিষ্ঠিত এবং যুক্তিসঙ্গত মান সম্পর্কে খুব কমই চিন্তা করে তবে তাদের নিজস্ব আবিষ্কার করার জন্য তাদের নিজস্ব আবিষ্কার করে। তা ছাড়াও সহায়ক উত্তর।
নিওনিত

2
@ মন্তব্যটির জন্য নিওন ধন্যবাদ, তবে মূল প্রশ্নটি ছিল এমএস এসকিউএল সার্ভার সম্পর্কে, সে কারণেই সেখানে যান। তবে আমি আমার উত্তরে এটি সম্পর্কে একটি নোট যুক্ত করব।
পাভেল মোর্শেনিয়ুক

13

আপনি যদি কলামটি নাল হতে দিচ্ছেন না তবে বিদ্যমান সারিগুলি তৈরি করতে আপনাকে একটি ডিফল্ট সরবরাহ করতে হবে। যেমন

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

এন্টারপ্রাইজ সংস্করণে এটি কেবলমাত্র 2012 সাল থেকে একটি মেটাডেটা পরিবর্তন হয়েছে


2
আপনার দরকার নেই, তবে এটি একটি বিকল্প।
ম্যাট

6

ত্রুটি বার্তাটি বেশ বর্ণনামূলক, চেষ্টা করুন:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

এবং ডিফল্ট অংশে "বিয়োগ" এর অর্থ কী?
ম্লাদেন বি।

3

অন্যান্য এসকিউএল বাস্তবায়নের অনুরূপ বিধিনিষেধ রয়েছে। কারণ হলো কলামের জন্য মান যোগ (কথাটি, এমনকি যদি শারীরিকভাবে নয়), যা ডিফল্টভাবে যে একটি কলাম যোগ প্রয়োজন NULL। আপনি যদি অনুমতি না দেন NULLএবং একটি না রাখেন defaultতবে মানটি কী হতে চলেছে?

যেহেতু এসকিউএল সার্ভার সমর্থন করে ADD CONSTRAINT, আমি প্যাভেলকে একটি অবনমিত কলাম তৈরি করার পদ্ধতির পরামর্শ দিচ্ছি এবং তারপরে NOT NULLএটি অ- NULLমান সহ পূরণ করার পরে একটি সীমাবদ্ধতা যুক্ত করব ।


মাইএসকিউএল ডেটা সহ বিদ্যমান টেবিলের সাথে নন কলামগুলি যুক্ত সমর্থন করে, যেখানে তথ্য ধরণের "বুদ্ধিমান" খালি মান বিদ্যমান সারিগুলিতে সরবরাহ করা হয় (যেমন, ফ্লোটের জন্য ০.০, পূর্ণসংখ্যার জন্য ০, স্ট্রিংয়ের জন্য খালি স্ট্রিং ইত্যাদি)।
মাইকেল সাঙ্গ

2

এটি আমার জন্য কাজ করেছে, ডিজাইন ভিউ থেকে "ধার করা "ও হতে পারে, পরিবর্তন করতে পারে -> ডান ক্লিক করুন -> পরিবর্তন স্ক্রিপ্ট তৈরি করা যায়।

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT


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