আমি কীভাবে এসকিউএল সার্ভার 2000 / এসকিউএল সার্ভার 2005 এর বিদ্যমান সারণিতে ডিফল্ট মান সহ একটি কলাম যুক্ত করতে পারি ?
আমি কীভাবে এসকিউএল সার্ভার 2000 / এসকিউএল সার্ভার 2005 এর বিদ্যমান সারণিতে ডিফল্ট মান সহ একটি কলাম যুক্ত করতে পারি ?
উত্তর:
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.
Alচ্ছিক সীমাবদ্ধতার নাম:
আপনি যদি ছেড়ে যান CONSTRAINT D_SomeTable_SomeCol
তবে এসকিউএল সার্ভার
একটি মজাদার নামের মতো একটি ডিফল্ট-কনট্রেন্টটি স্বয়ংক্রিয়ভাবে তৈরি করবে:DF__SomeTa__SomeC__4FB7FEF6
ঐচ্ছিক with-মানগুলি বিবৃতি: শুধুমাত্র প্রয়োজন হয় যখন আপনার কলাম Nullable হয়
এবং আপনি ডিফল্ট মান বিদ্যমান রেকর্ড করার জন্য ব্যবহার করা চাই।
যদি আপনার কলামটি হয় , তবে এটি
নির্দিষ্ট করে দেওয়া হোক না কেন এটি সমস্ত বিদ্যমান রেকর্ডগুলির জন্য স্বয়ংক্রিয়ভাবে ডিফল্ট মানটি ব্যবহার করবে ।WITH VALUES
NOT NULL
WITH VALUES
ডিফল্ট-সীমাবদ্ধতার সাথে কীভাবে সন্নিবেশগুলি কাজ করে:
আপনি যদি কোনও রেকর্ড সন্নিবেশ করান SomeTable
এবং এর মান নির্দিষ্ট না করেনSomeCol
তবে এটি ডিফল্ট হয়ে যাবে 0
।
যদি আপনি একটি রেকর্ড সন্নিবেশ করেন এবংSomeCol
এর মান নির্দিষ্ট করে NULL
(এবং আপনার কলামটি নালার অনুমতি দেয়),
তবে ডিফল্ট-সীমাবদ্ধতা ব্যবহার করা হবে না এবং NULL
মান হিসাবে সন্নিবেশ করা হবে।
নোটগুলি নীচে প্রত্যেকের দুর্দান্ত প্রতিক্রিয়ার ভিত্তিতে ছিল।
বিশেষভাবে ধন্যবাদ:
@ ইয়াত্রিক্স, @ ওয়াল্টারস্টাবোস্জ, @ ইয়াহু সিরিয়াস, এবং @ স্ট্যাকম্যান তাদের মন্তব্যের জন্য।
NOT NULL
। দয়া করে এটি চেষ্টা করুন: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
আপনি কলামের জন্য 2 টি নাল মান দেখতে পাবেন b
।
WITH VALUES
বিদ্যমান নালযোগ্য সারিগুলি আপডেট করতে ব্যবহার করুন । এমএসডিএন দেখুন : "যদি যুক্ত কলামটি নাল মানগুলিকে মঞ্জুরি দেয় এবং WITH VALUES
নির্দিষ্ট করা হয় তবে ডিফল্ট মানটি নতুন কলামে বিদ্যমান সারিগুলিতে যুক্ত থাকে" "
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
ডিফল্ট অন্তর্ভুক্তি ডিফল্ট মান সহ বিদ্যমান সারিগুলিতে কলামটি পূরণ করে , তাই নন নলের বাধা লঙ্ঘন করা হয় না।
একটি নল কলাম যুক্ত করার সময় , WITH VALUES
নিশ্চিত করা হবে যে নির্দিষ্ট ডিফল্ট মান বিদ্যমান সারিগুলিতে প্রয়োগ করা হয়েছে:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
সীমাবদ্ধতার সাথে একটি কলামের সর্বদা মান থাকবে - এটি NOT NULL
নির্দিষ্ট না হওয়া সত্ত্বেও, NULL হবে না UL
BIT
ডেটাটাইপ নিয়ে কথা বলছিলাম না , আমি এই বিশেষ BIT
কলামটি নিয়ে কথা বলছিলাম । উত্তরটি দেখুন, কলামটি হিসাবে ঘোষিত হয়েছে NOT NULL
।
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
আপনি যে কলামটি যুক্ত করছেন তাতে NOT NULL
বাধা থাকলেও DEFAULT
সীমাবদ্ধতা (মান) নেই Be ALTER TABLE
বিবৃতি যে ক্ষেত্রে ব্যর্থ হয়ে যাবে টেবিল মধ্যে কোন সারি হয়েছে। সমাধানটি হ'ল হয় NOT NULL
নতুন কলাম থেকে সীমাবদ্ধতা সরিয়ে নেওয়া বা DEFAULT
এটির জন্য একটি সীমাবদ্ধতা সরবরাহ করা।
আপনি যদি একাধিক কলাম যুক্ত করতে চান তবে উদাহরণস্বরূপ এটি করতে পারেন:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
ব্যবহার করুন:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
রেফারেন্স: অলটার টেবল (লেনদেন-এসকিউএল) (এমএসডিএন)
একটি ডিফল্ট মান সহ একটি বিদ্যমান ডাটাবেস সারণিতে একটি কলাম যুক্ত করতে, আমরা ব্যবহার করতে পারি:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
ডিফল্ট মান সহ একটি বিদ্যমান ডাটাবেস সারণিতে কলাম যুক্ত করার অন্য উপায় এখানে।
একটি ডিফল্ট মান সহ একটি কলাম যুক্ত করার জন্য আরও পুঙ্খানুপুঙ্খ এসকিউএল স্ক্রিপ্টের নীচে এটি অন্তর্ভুক্ত করার আগে কলামটি সীমাবদ্ধ রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং এটি রয়েছে কিনা তা অন্তর্ভুক্ত রয়েছে তা পরীক্ষা করে নিচে রয়েছে। এই স্ক্রিপ্টটিও এই সীমাবদ্ধতার নাম দেয় যাতে আমরা একটি সুন্দর নামকরণের কনভেনশন করতে পারি (আমার পছন্দ DF_) এবং যদি এসকিউএল না হয় তবে আমাদের নামের সাথে একটি সীমাবদ্ধতা দেয় যা এলোমেলোভাবে উত্পন্ন সংখ্যা রয়েছে; সুতরাং বাধাটির নামও রাখতে পেরে খুব ভাল লাগছে।
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
ডিফল্ট মান সহ একটি বিদ্যমান ডাটাবেস সারণিতে কলাম যুক্ত করার জন্য এই দুটি উপায়।
আপনি টি-এসকিউএল দিয়ে নিম্নলিখিত পদ্ধতিতে জিনিসটি করতে পারেন।
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
পাশাপাশি আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করতে পারেন ডিজাইনের মেনুতে ডান ক্লিক করে টেবিলের ডিফল্ট মান সেট করে।
এবং তদ্ব্যতীত, আপনি যদি ডাটাবেসে সমস্ত সারণীতে একই কলামটি (এটি উপস্থিত না থাকে) যুক্ত করতে চান, তবে ব্যবহার করুন:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
এসকিউএল সার্ভার ২০০৮-আর 2 এ, আমি ডিজাইন মোডে যাই - একটি পরীক্ষণ ডাটাবেসে - এবং ডিজাইনার ব্যবহার করে আমার দুটি কলাম যুক্ত করে GUI এর সাথে সেটিংস তৈরি করি, এবং তারপরে কুখ্যাতটি Right-Click" জেনারেট চেঞ্জ স্ক্রিপ্ট " বিকল্পটি দেয় !
ব্যাং আপ এর সাহায্যে কিছুটা উইন্ডো পপ হয়, আপনি এটি অনুমান করেছিলেন, সঠিকভাবে ফর্ম্যাট করে কাজ-থেকে-পরিবর্তন কাজের স্ক্রিপ্ট। সহজ বোতামটি হিট করুন।
বিকল্পভাবে, আপনি সীমাবদ্ধতার নাম স্পষ্টভাবে না বলেই একটি ডিফল্ট যুক্ত করতে পারেন:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
এই সীমাবদ্ধতা তৈরি করার সময় যদি আপনার বিদ্যমান ডিফল্ট সীমাবদ্ধতার সাথে সমস্যা থাকে তবে সেগুলি দ্বারা মুছে ফেলা যেতে পারে:
alter table [schema].[tablename] drop constraint [constraintname]
এটি এসএসএমএস জিইউতেও করা যেতে পারে। আমি নীচে একটি ডিফল্ট তারিখ দেখায় তবে অবশ্যই ডিফল্ট মানটি যাই হোক না কেন হতে পারে।
(getdate())
বা abc
বা 0
বা যাই হোক না কেন মান আপনি চান ডিফল্ট মান বা বাঁধাই নীচে অঙ্কিত ক্ষেত্র:ALTER TABLE ADD ColumnName {Column_Type} Constraint
এমএসডিএন নিবন্ধ অলটার টেবিলে (লেনদেন-এসকিউএল) এর সমস্ত পরিবর্তনের টেবিল বাক্য গঠন রয়েছে।
উদাহরণ:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
প্রথমে নামের শিক্ষার্থী সহ একটি সারণী তৈরি করুন:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
এটিতে একটি কলাম যুক্ত করুন:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
সারণীটি তৈরি করা হয় এবং একটি কলাম একটি ডিফল্ট মান সহ একটি বিদ্যমান টেবিলের সাথে যুক্ত করা হয়।
এর অনেক উত্তর রয়েছে তবে আমি এই বর্ধিত পদ্ধতিটি যুক্ত করার প্রয়োজন অনুভব করছি। এটি অনেক বেশি দীর্ঘ বলে মনে হচ্ছে তবে আপনি যদি সক্রিয় ডাটাবেসে কয়েক মিলিয়ন সারি যুক্ত একটি টেবিলের জন্য একটি নল নীল ক্ষেত্র যুক্ত না করেন তবে এটি অত্যন্ত কার্যকর।
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
এটি যা করবে তা হ'ল কলামটি বাতিলযোগ্য ক্ষেত্র হিসাবে যুক্ত করা এবং ডিফল্ট মান সহ, সমস্ত ক্ষেত্রকে ডিফল্ট মানটিতে আপডেট করুন (বা আপনি আরও অর্থবোধক মান নির্ধারণ করতে পারেন) এবং অবশেষে এটি কলামটি নাল নয় change
এর কারণ হ'ল যদি আপনি একটি বৃহত স্কেল টেবিল আপডেট করেন এবং একটি নতুন নয় নাল ক্ষেত্র যুক্ত করেন তবে এটি প্রতিটি একক সারিতে লিখতে হবে এবং এটি কলাম যুক্ত করার সাথে সাথে পুরো টেবিলটি লক আউট করবে এবং তারপরে সমস্ত মান লিখবে।
এই পদ্ধতিটি নলযোগ্য কলাম যুক্ত করবে যা নিজে থেকে অনেক দ্রুত পরিচালিত হয়, তারপরে নাল স্থিতি স্থির করার আগে ডেটা পূরণ করে।
আমি খুঁজে পেয়েছি যে পুরো জিনিসটি একটি বিবৃতিতে করা আমাদের 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 Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
এসকিউএল সার্ভার + টেবিল পরিবর্তন করুন + কলাম + ডিফল্ট মান অনন্য পরিচয়কারী যুক্ত করুন
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
IF NOT EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
NOT EXISTS
টেবিল পরিবর্তন করার চেষ্টা করার আগে আমি চেকটি পছন্দ করি । খুব ভাল সমাধান। এই কাজগুলি কীভাবে এটিকে আরও কার্যকর করে তুলবে সে সম্পর্কে কিছু অতিরিক্ত মন্তব্য।
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
একটি টেবিলটিতে একটি নতুন কলাম যুক্ত করুন:
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 TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
উদাহরণ:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
আপনি যদি সীমাবদ্ধতাগুলি যুক্ত করতে চান তবে:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
এটি নীচের কোড দ্বারা করা যেতে পারে।
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 MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
এটি সারণীতে একটি নতুন কলাম যুক্ত করবে।
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
এই ক্যোয়ারী থেকে আপনি ডিফল্ট মান 0 দিয়ে ডেটাটাইপ পূর্ণসংখ্যার কলাম যুক্ত করতে পারেন।
ঠিক আছে, আমার এখন আমার আগের উত্তরের কিছুটা পরিবর্তন আছে। আমি লক্ষ্য করেছি যে উত্তরগুলির কোনও উল্লেখ নেই 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
তাই আমি ডিফল্ট মান 1 রেখেছি।
আমি উপরোক্ত সিস্টেমটির পরামর্শ দিচ্ছি, কারণ আমি কোনও সমস্যার মুখোমুখি হয়েছি। তাহলে সমস্যাটা কি? সমস্যাটি হ'ল, যদি IsBilledToClient
কলামটি টেবিল টেবিলটিতে উপস্থিত থাকে তবে আপনি নীচে প্রদত্ত কোডের অংশটি সম্পাদন করলে আপনি এসকিউএল সার্ভার কোয়েরি বিল্ডারে একটি ত্রুটি দেখতে পাবেন। তবে যদি এটি বিদ্যমান না থাকে তবে প্রথমবার কার্যকর করার সময় কোনও ত্রুটি হবে না।
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]