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


90

কোনও বিদ্যমান কলামের মানের সমান ডিফল্ট মান সহ কোনও এসকিউএল সার্ভার টেবিলটিতে কীভাবে একটি কলাম যুক্ত করবেন?

আমি এই টি-এসকিউএল বিবৃতিটি চেষ্টা করেছি:

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

তবে এটি একটি ত্রুটি দিচ্ছে:

"প্রবীণ কলাম" নামটি এই প্রসঙ্গে অনুমোদিত নয়। বৈধ এক্সপ্রেশন হ'ল ধ্রুবক, ধ্রুবক প্রকাশ এবং (কিছু প্রসঙ্গে) ভেরিয়েবল। কলামের নাম অনুমোদিত নয়।


6
ডিফল্ট মানটি একটি ধ্রুবক হতে পারে, অন্য কলামে নয়। আমার মনে হয় এটির একটি ট্রিগার দরকার।
ypercubeᵀᴹ

4
ঠিক আছে, আমি কীভাবে এটি করতে পারি, আমি স্কিএলে নতুন।
dodos

4
এটি কি সর্বদা ডিফল্ট হতে চলেছে, বা টেবিলের সাথে নতুন কলাম যুক্ত হওয়ার সাথে সাথে এটি বিদ্যমান সারিগুলির জন্য কলামটি পপুল করার জন্য?
দামিয়েন_ও_বিশ্বাসীরা

4
@ দামিয়েন_এই_বিশ্বাসীরা কেবল বিদ্যমান সারিগুলির জন্য কলামটি পপুল করার জন্য।
dodos

4
আপনার UPDATEতখন আলাদা হিসাবে এটি করতে হবে , আমি ভীত।
দামিয়েন_ও_বিশ্বাসীরা

উত্তর:


73

এটা চেষ্টা কর:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go

4
.. চোখ, তবে এটি কেবল বিদ্যমান সারিগুলির জন্য কাজ করবে। নতুন সারি সন্নিবেশ করা হলে এটি [নতুন কলাম] মান সেট করবে না। আপনার পরে INSERT ট্রিগার ইত্যাদি দরকার
মিলান

14
এটি টেবিলটিতে সম্ভবত অনিচ্ছাকৃত ডিফল্ট বাধা যুক্ত করে
রোমেন ভার্জিনি

4
@ রোমেন ভার্গনোরি আমি সম্মতি জানাই, প্রথমে নাল না দেওয়ার সীমাবদ্ধতা ছাড়াই ভাল, তারপরে বিদ্যমান কলামটি দিয়ে মানগুলি তৈরি করা এবং পরে আবার একটি নাল যুক্ত করা যায় না
অ্যাডকেলে

15

আমি তাদের খুব পছন্দ করি না তবে আপনি AFTER INSERTট্রিগার দিয়ে কীভাবে এটি করতে পারেন তা এখানে :

CREATE TRIGGER TableX_AfterInsert_TRG 
  ON TableX 
AFTER INSERT
AS
  UPDATE TableX AS t
  SET t.newcolumn = t.oldcolumn
  FROM Inserted AS i
  WHERE t.PK = i.PK ;              -- where PK is the PRIMARY KEY of the table   

13

AFTER INSERTট্রিগার পদ্ধতির অতিরিক্ত কারণে ওভারহেড জড়িত UPDATEবিবৃতি। আমি INSTEAD OF INSERTনিম্নলিখিত হিসাবে ট্রিগার ব্যবহার করার পরামর্শ দিচ্ছি :

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS
INSERT INTO tablename (oldcolumn, newcolumn)
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn)
FROM inserted

এটি কোনও oldcolumnস্ব-পরিচয় কলাম হলেও এটি কাজ করে না ।


4
INSTEAD OFঅস্থায়ী টেবিলগুলি ব্যবহার করার সময় ট্রিগারগুলিও কাজ করে না:SYSTEM_VERSIONING = ON
ক্যালভিনডেল

3

কপিলের উত্তরটি প্রসারিত করতে এবং অবাঞ্ছিত ডিফল্ট সীমাবদ্ধতা এড়াতে এটি চেষ্টা করুন:

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999
Go
Update tablename SET newcolumn = oldcolumn
Go
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN
Go

-99999 কে 'নোডাটা' দ্বারা প্রতিস্থাপন করুন যদি আপনার ধরণটি বারচার, এনভারচার, ডেটটাইম, ... বা অন্য ধরণের কোনও সামঞ্জস্যপূর্ণ ডেটা দ্বারা হয়: নির্দিষ্ট মান বিবেচিত হয় না, এটি ২ য় নির্দেশ দ্বারা মুছে যাবে।


1

আপনি বিদ্যমান কলাম মানের উপর ভিত্তি করে একটি সারণীতে নতুন কলাম সন্নিবেশ করতে গণিত কলাম ব্যবহার করতে পারেন

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

বা, আপনি যদি বিদ্যমান কলাম মানের উপর ভিত্তি করে মানটিতে কিছু পরিবর্তন করতে চান তবে ব্যবহার করুন

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

0

আমার ক্ষেত্রে, আমি CODE নামে একটি নতুন নয় নাল অনন্য কলাম যুক্ত করতে চাই তবে আমি তৈরির সময় মান সম্পর্কে জানি না। আমি নিউআইডি () এর পরে ডিফল্ট মান পেয়ে তার জন্য ডিফল্ট মান সেট করেছিলাম পরে আপডেট করুন।

ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5))

ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])

-3

আমি মনে করি আপনি যদি এটি ব্যবহার করেন Set Identity_Insert <TableName> OFFএবং সন্নিবেশ বিবৃতিটি পরে ব্যবহার করেন তবে এটি কার্যকর হবে Set Identity_Insert <TableName> ON

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