SQL সার্ভারে একটি বিদ্যমান সারণিতে একটি ডিফল্ট মান সহ একটি কলাম যোগ করুন




sql-server sql-server-2005 (24)

SQL সার্ভার 2008-R2 এ, আমি নকশা মোডে গিয়েছি - একটি পরীক্ষামূলক ডাটাবেসে - এবং ডিজাইনার ব্যবহার করে আমার দুটি কলাম যোগ করে এবং GUI এর সাথে সেটিংস তৈরি করে এবং তারপর কুখ্যাত রাইট ক্লিক ক্লিক করে " জেনারেট চেঞ্জ স্ক্রিপ্ট " বিকল্পটি দেয়। !

Bang আপ দিয়ে একটি ছোট উইন্ডো পপ করে, আপনি এটি অনুমান করেছেন, সঠিকভাবে বিন্যাসিত গ্যারান্টি-টু-ওয়ার্ক পরিবর্তন স্ক্রিপ্ট। সহজ বাটন আঘাত।

একটি ডিফল্ট মান সহ একটি কলাম SQL সার্ভার 2000 / SQL সার্ভার 2005 একটি বিদ্যমান সারণিতে যোগ করা যাবে কিভাবে?


এসকিউএল সার্ভার + আল্টার টেবিল + কলাম + ডিফল্ট মান অনন্য সনাক্তকারী যোগ করুন

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))

ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

DEFAULT অন্তর্ভুক্তি ডিফল্ট মান সহ বিদ্যমান সারির কলামটি পূরণ করে, তাই নূন্যতম সীমাবদ্ধতা লঙ্ঘন করা হয় না।


ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

এই নীচের কোড দ্বারা সম্পন্ন করা যেতে পারে।

CREATE TABLE TestTable
    (FirstCol INT NOT NULL)
    GO
    ------------------------------
    -- Option 1
    ------------------------------
    -- Adding New Column
    ALTER TABLE TestTable
    ADD SecondCol INT
    GO
    -- Updating it with Default
    UPDATE TestTable
    SET SecondCol = 0
    GO
    -- Alter
    ALTER TABLE TestTable
    ALTER COLUMN SecondCol INT NOT NULL
    GO

অন্যথায়, আপনি সীমাবদ্ধভাবে নামটি সীমাবদ্ধ না করে একটি ডিফল্ট যোগ করতে পারেন:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

এই সীমাবদ্ধতা তৈরি করার সময় যদি আপনার বিদ্যমান ডিফল্ট সীমাবদ্ধতাগুলির সাথে কোন সমস্যা থাকে তবে তাদের দ্বারা সরানো যেতে পারে:

alter table [schema].[tablename] drop constraint [constraintname]

এটি এসএসএমএস GUI হিসাবে ভাল করা যেতে পারে। আমি নীচে একটি ডিফল্ট তারিখ প্রদর্শন কিন্তু অবশ্যই ডিফল্ট মান যাই হোক না কেন হতে পারে।

  1. নকশা দর্শনে আপনার টেবিল রাখুন (বস্তু এক্সপ্লোরার টেবিল ডান ক্লিক করুন-> ডিজাইন)
  2. টেবিলে একটি কলাম যুক্ত করুন (অথবা কলামটিতে ক্লিক করুন যদি এটি ইতিমধ্যে বিদ্যমান থাকে তবে আপডেট করুন)
  3. নীচের কলাম প্রোপার্টিতে, প্রবেশ করুন (getdate()) অথবা abc অথবা 0 অথবা আপনি যে মানটি চান তা ডিফল্ট মান বা বাইন্ডিং ক্ষেত্রের মধ্যে নীচের চিত্রের মতো করুন:


একটি টেবিলে একটি নতুন কলাম যোগ করুন:

ALTER TABLE [table]
ADD Column1 Datatype

উদাহরণ স্বরূপ,

ALTER TABLE [test]
ADD ID Int

যদি ব্যবহারকারী এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি করতে চায় তবে:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

এটা চেষ্টা কর

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO

আপনি যদি একাধিক কলাম যোগ করতে চান তবে উদাহরণস্বরূপ আপনি এটি করতে পারেন:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO

আপনি যে কলামটি যুক্ত করছেন সেটি যখন কোনও NOT NULL সীমাবদ্ধতা থাকে তখন সাবধান থাকুন, তবে এতে কোনও বিধিনিষেধ নেই (মান)। যদি টেবিলে কোন সারি থাকে তবে ALTER TABLE বিবৃতিটি সেই ক্ষেত্রে ব্যর্থ হবে। সমাধানটি নতুন কলাম থেকে NOT NULL সীমাবদ্ধতা সরাতে হয় NOT NULL বা এটির জন্য DEFAULT সীমাবদ্ধতা সরবরাহ করে।


একটি বাতিলযোগ্য কলাম যোগ করার সময়, WITH VALUES নির্দিষ্ট ডিফল্ট মান বিদ্যমান সারিতে প্রয়োগ করা হবে তা নিশ্চিত করবে:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

ব্যবহার করুন:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 

আচ্ছা, এখন আমার আগের উত্তরটিতে কিছু পরিবর্তন আছে। আমি লক্ষ্য করেছি যে উত্তরগুলির কোনও উল্লেখ নেই IF NOT EXISTS । সুতরাং আমি এটির একটি নতুন সমাধান সরবরাহ করতে যাচ্ছি কারণ টেবিলের পরিবর্তন কিছু সমস্যা হয়েছে।

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

এখানে TaskSheet বিশেষ টেবিল নাম এবং IsBilledToClient হল নতুন কলাম যা আপনি ঢোকাতে যাচ্ছেন এবং 1 ডিফল্ট মান। তার মানে নতুন কলামে বিদ্যমান সারির মান কত হবে, তাই এটি স্বয়ংক্রিয়ভাবে সেখানে সেট করা হবে। যাইহোক, আপনি কলামের BIT আপনার BIT পরিবর্তন করতে পারেন যেমন আমি BIT ব্যবহার করেছি, তাই আমি ডিফল্ট মান 1 রাখি।

আমি উপরে সিস্টেম সুপারিশ, কারণ আমি একটি সমস্যা সম্মুখীন হয়েছে। তাহলে সমস্যাটা কি? সমস্যাটি হল, যদি IsBilledToClient কলামটি টেবিল টেবিলের মধ্যে বিদ্যমান থাকে তবে আপনি যদি নীচের IsBilledToClient অংশটি শুধুমাত্র কার্যকর করেন তবে আপনি SQL সার্ভার কোয়েরি বিল্ডারে একটি ত্রুটি দেখতে পাবেন। কিন্তু যদি এটি বিদ্যমান না হয় তবে নির্বাহ করার সময় প্রথমবারের মতো কোন ত্রুটি হবে না।

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]


শুধুমাত্র দুটি লাইন সঙ্গে সবচেয়ে মৌলিক সংস্করণ

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

এসকিউএল সার্ভার + আল্টার টেবিল + কলাম + ডিফল্ট মান অনন্য সনাক্তকারী যোগ করুন ...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO

আপনি নিম্নলিখিত উপায়ে টি-এসকিউএল দিয়ে জিনিস করতে পারেন।

 ALTER TABLE {TABLENAME}
 ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
 CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

পাশাপাশি আপনি ডিজাইন মেনুতে ডানে ক্লিক টেবিলের মাধ্যমে SQL সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করতে পারেন, টেবিলে ডিফল্ট মান সেট করছেন।

এবং আরও, যদি আপনি ডাটাবেসের সকল সারণিতে একই কলাম (যদি এটি বিদ্যমান না থাকে) যোগ করতে চান তবে ব্যবহার করুন:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;

বাক্য গঠন:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

উদাহরণ:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

নোট:

ঐচ্ছিক সীমাবদ্ধতা নাম:
যদি আপনি CONSTRAINT D_SomeTable_SomeCol ছেড়ে যান তবে SQL সার্ভারটি স্বয়ংক্রিয়ভাবে তৈরি হবে
একটি মজার নাম দিয়ে ডিফল্ট- DF__SomeTa__SomeC__4FB7FEF6 নাম: DF__SomeTa__SomeC__4FB7FEF6

ঐচ্ছিক সহ-মূল্য বিবৃতি:
যখন আপনার কলামটি বাতিল হয় তখন মূল্যগুলির WITH VALUES কেবলমাত্র প্রয়োজন হয়
এবং আপনি ডিফল্ট মান বিদ্যমান রেকর্ডের জন্য ব্যবহার করতে চান।
আপনার কলাম NOT NULL , এটি স্বয়ংক্রিয়ভাবে ডিফল্ট মান ব্যবহার করবে
সমস্ত বিদ্যমান রেকর্ডের জন্য, আপনি মূল্য WITH VALUES নির্দিষ্ট কিনা বা না।

কিভাবে একটি ডিফল্ট-সংযম সঙ্গে কাজ সন্নিবেশ করান:
যদি আপনি SomeTable একটি রেকর্ড সন্নিবেশ করেন এবং SomeTable এর মান উল্লেখ না করেন তবে এটি 0 থেকে ডিফল্ট হবে।
যদি আপনি একটি রেকর্ড সন্নিবেশ করান এবং NULL হিসাবে এবং SomeCol এর মান উল্লেখ করুন (এবং আপনার কলাম SomeCol অনুমোদন করে)
তারপর ডিফল্ট-সীমাবদ্ধতা ব্যবহার করা হবে না এবং NULL মান হিসাবে সন্নিবেশ করা হবে।

নোট নীচের প্রত্যেকের মহান মতামত উপর ভিত্তি করে ছিল।
বিশেষ ধন্যবাদ:
@ ইয়্যাট্রিক্স, @ ওয়াল্টারস্টাবোস, @ ইয়াহু সিরিয়াস, এবং @ স্ট্যাকম্যান তাদের মন্তব্যের জন্য।


ডিফল্ট যদি নাল হয়, তাহলে:

  1. SQL সার্ভারে, লক্ষ্যযুক্ত টেবিলের গাছটি খুলুন
  2. ডান ক্লিক করুন "কলাম" ==> New Column
  3. কলাম নাম Select Type , এবং Nulls মঞ্জুরি দিন চেকবক্স চেক করুন
  4. মেনু বার থেকে, Save ক্লিক Save

সম্পন্ন!


উদাহরণ:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO

--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

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

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

এইটি কী করবে একটি কলামযোগ্য ক্ষেত্র হিসাবে এবং ডিফল্ট মান সহ কলামটি ডিফল্ট মানতে আপডেট করুন (অথবা আপনি আরো অর্থপূর্ণ মান নির্ধারণ করতে পারেন), এবং অবশেষে এটি কলামটি নুল হতে পরিবর্তন করবে না।

এর কারণ হল যদি আপনি একটি বড় স্কেল টেবিল আপডেট করেন এবং একটি নতুন নাল ক্ষেত্র যোগ করেন তবে এটি প্রতিটি একক সারিতে লিখতে হবে এবং এর ফলে পুরো টেবিলে লক হয়ে যাবে কারণ এটি কলাম যোগ করে এবং তারপর সমস্ত মান লিখতে পারে।

এই পদ্ধতিটি নালযোগ্য কলাম যোগ করবে যা নিজের দ্বারা খুব দ্রুত পরিচালনা করে, তারপর নল স্থিতি সেট করার আগে তথ্যটি পূরণ করে।

আমি দেখেছি যে এক বিবৃতিতে সমগ্র জিনিসটি 4-8 মিনিটের জন্য আমাদের আরও সক্রিয় টেবিলগুলির মধ্যে একটি লক করে এবং প্রায়শই আমি প্রক্রিয়াটিকে হত্যা করেছি। এই পদ্ধতিটি সাধারণত প্রতিটি অংশে মাত্র কয়েক সেকেন্ড সময় লাগে এবং সর্বনিম্ন লকিংয়ের কারণ হয়।

অতিরিক্তভাবে, যদি আপনার কোটি কোটি সারি এলাকায় একটি টেবিল থাকে তবে এটি আপডেটের মতো বাচানোর যোগ্য হতে পারে:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END

ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO




sql-server-2000