আমি কি এসকিউএল সার্ভারে একটি অ্যাড কলাম বিবৃতিতে একটি নামযুক্ত ডিফল্ট সীমাবদ্ধতা তৈরি করতে পারি?


163

এসকিউএল সার্ভারে, আমার টেবিলে একটি নতুন কলাম রয়েছে:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

এটি ব্যর্থ হয়েছে কারণ আমি কোনও ডিফল্ট সীমাবদ্ধতা নির্দিষ্ট না করেই নুলকে নির্দিষ্ট করে না। সারণীতে ডিফল্ট সীমাবদ্ধতা থাকা উচিত নয়।

এটি পেতে, আমি ডিফল্ট সীমাবদ্ধতার সাহায্যে টেবিলটি তৈরি করতে এবং তারপরে এটি সরাতে পারি।

তবে, এই বিবৃতিটির অংশ হিসাবে ডিফল্ট সীমাবদ্ধতার নামকরণ করা উচিত বলে উল্লেখ করার কোনও উপায় নেই বলে মনে হয়, সুতরাং এ থেকে মুক্তি পাওয়ার জন্য আমার একমাত্র উপায় হ'ল একটি সঞ্চিত প্রক্রিয়া যা এটি সিএস.ডিফল্ট_কন্ট্রেন্টগুলিতে দেখায় have টেবিল।

এটি একটি অপারেশনের জন্য কিছুটা অগোছালো / ভারবোজ যা অনেকটা হওয়ার সম্ভাবনা রয়েছে। কারও কি এর জন্য আরও ভাল সমাধান আছে?

উত্তর:


224

এই কাজ করা উচিত:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
2012 সালেও কাজ করে। রক্তাক্ত বিবরণ: msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
কেন NOT NULLডেটা টাইপের সংলগ্ন লাগাবেন না ? সীমাবদ্ধতার পরে এটি রাখা সিনথেটিকভাবে বৈধ হতে পারে তবে এটি সেখানে রাখা বিভ্রান্তিকর বলে মনে হচ্ছে।
তুলো_এক্স 86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
আমি এটি গ্রহণযোগ্য উত্তরের চেয়ে বেশি পছন্দ করি কারণ আমি নট নয় বাধা হারানোর চিন্তা না করেই ডিফল্ট সীমাবদ্ধতা ফেলে দিতে পারি।
একাদশ

7
পছন্দ করুন নট নুল বাধা নয় এবং ড্রপ স্টেটমেন্টটি কেবল সীমাবদ্ধতার নামটির উল্লেখ করে
রজার উইলককস

11
@ রাজারউইলককস আপনি ঠিকই বলেছেন, তবে এটি পড়ার পরে আরও স্পষ্ট হয় যে এই নোটটি বাধা থেকে আলাদা নয়।
ডিলাক্সক্সে

10

বিদ্যমান উত্তরগুলি বরং পাতলা হওয়ায় আমি কিছু বিশদ যুক্ত করতে চাই :

সর্বাধিক গুরুত্বপূর্ণ ইঙ্গিতটি হ'ল: আপনার স্পষ্ট নাম ব্যতীত কখনও বাধা সৃষ্টি করা উচিত নয়!

নামবিহীন প্রতিবন্ধকতাগুলির সাথে সর্বাধিক সমস্যা : আপনি যখন বিভিন্ন গ্রাহক মেশিনে এটি চালাবেন, আপনি প্রতিটিের জন্য আলাদা / এলোমেলো নাম পাবেন । ভবিষ্যতের যে
কোনও আপগ্রেড স্ক্রিপ্টটি আসল মাথাব্যথা হবে ...

সাধারণ পরামর্শটি হ'ল:

  • নাম ছাড়া কোনও বাধা নেই!
  • কিছু নামকরণ কনভেনশন যেমন ব্যবহার করুন
    • DF_TableName_ColumnName একটি ডিফল্ট সীমাবদ্ধতার জন্য
    • CK_TableName_ColumnName একটি চেক সীমাবদ্ধতার জন্য
    • UQ_TableName_ColumnName একটি অনন্য বাধা জন্য
    • PK_TableName একটি প্রাথমিক কী বাধা জন্য

সাধারণ বাক্যবিন্যাস হয়

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

এখানে চেষ্টা করুন

আপনি প্রতিটি কলামে আরও প্রতিবন্ধকতা যুক্ত করতে পারেন এবং কমা হিসাবে কলামগুলি যুক্ত করার সাথে আপনি অতিরিক্ত বাধা যুক্ত করতে পারেন:

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

- কিছু তথ্য সন্নিবেশ করুন

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

স্ক্রিপ্টের নীচের মতো চেষ্টা করুন-

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.