একটি সারণী তৈরি করার সময় ডিফল্ট সীমাবদ্ধতা ঘোষণা করা


100

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

এই কোডটি আমি আসলে ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে:

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE())
)

আমি প্রাথমিক কী, বিদেশী কী এবং চেক সীমাবদ্ধতাগুলি তাদের নিজস্ব হিসাবে নির্দিষ্ট করেছি কারণ এইভাবে আমি তাদের জন্য একটি নাম সংজ্ঞায়িত করতে পারি, অন্যথায় তাদেরকে ইনলাইন ঘোষণার ফলে এসকিউএল সার্ভারটি একটি এলোমেলো নাম জেনারেট করে এবং আমি এটি "পছন্দ করি না"।

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

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

বা

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"

ইনলাইন পদ্ধতিটি সূক্ষ্মভাবে কাজ করে, তবে এটি কনস্ট্যান্টের জন্য যথারীতি একটি এলোমেলো নাম উত্পন্ন করে, একা স্ট্যান্ড পদ্ধতিটি বলে ত্রুটি ছুঁড়ে ফেলে Incorrect syntax near 'FOR'.

এছাড়াও, আমি যদি টেবিলটি তৈরি করি এবং ALTERএটি পরে , কমান্ডটি কাজ করে:

ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"


একটি রেফারেন্স হিসাবে, এখানে আমি কার্যকর করার চেষ্টা করছি এমন পূর্ণ কোড:

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()),
    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
)



আমি এখানে পুরোপুরি লোকসানে আছি, যা আমি সম্ভব না করার চেষ্টা করছি, বা আমি কিছু ভুল করছি?


সম্পাদনা করুন:

ডেভিড এম কীভাবে ইনলাইন সিনট্যাক্স ব্যবহার করে একটি নামযুক্ত ডিফল্ট সীমাবদ্ধতা যুক্ত করবেন তা দেখিয়েছি, আমি এখনও বুঝতে চাইছি যে স্ট্যান্ড একা সিনট্যাক্সটি সম্পূর্ণ ভুল বা এটি আমার দোষ is


4
আমি সম্পাদনার সাথে একমত ডেভিড এম এর প্রতিক্রিয়া কীভাবে কোনও এককভাবে বাধা ঘোষণার মাধ্যমে সীমাবদ্ধতা যুক্ত করতে পারে তা কভার করে না, তবে যেহেতু বিওএল এর কোনও উদাহরণ নেই যেখানে আপনি ডেভিড এম যেভাবে প্রদর্শন করেছিলেন তা বাদ দিয়ে যেখানে আপনি ডিফল্ট সীমাবদ্ধতার নাম রাখতে পারেন , আমি মনে করি এটি এসকিউএল ধরে নেওয়া নিরাপদ think সার্ভার (অসঙ্গতভাবে) এই সিনট্যাক্সটিকে সমর্থন করে না।
পিটার মাজেদ

উত্তর:


178

এটি কলাম তৈরির সাথে ইনলাইন করুন:

[load_date] SMALLDATETIME NOT NULL
        CONSTRAINT [df_load_date] DEFAULT GETDATE()

আমি অনেকগুলি পাঠক QUOTED_IDENTIFIERSডিফল্টরূপে কাজ করবে না বলে উদ্ধৃতিগুলির চেয়ে স্কোয়ার বন্ধনী ব্যবহার করেছি ।


4
ধন্যবাদ, এটি নামের সমস্যার সমাধান করে। এখন আমি এই আচরণটি "ডিজাইন দ্বারা" (যেমন এটি করা সম্ভব নয়) বা এটি করার কোনও উপায় আছে কিনা তা সনাক্ত করার চেষ্টা করছি। আপনি জানেন, আমি আমার কোডটি "পরিপাটি" রাখতে এবং কলামগুলির পরে ঘোষিত প্রতিবন্ধকতাগুলি এসকিউএল ফাইলগুলি আরও স্পষ্ট করে বুঝতে এবং ডিবাগ করা সহজতর করে (বা কমপক্ষে এটি আমার মনে হয়)।
আলবিরেও

4
@ আলবিরেও - ডিজাইন অনুসারে table_constraintমধ্যে ব্যাকরণ অন্তর্ভুক্ত নয়DEFAULT
মার্টিন স্মিথ

4
এই সমাধানটি কেবল তখনই আমার পক্ষে কাজ করে যখন আমি ক্ষেত্রের চারপাশে উদ্ধৃতিগুলি এবং সীমাবদ্ধতার নামগুলি সরিয়ে ফেলি।
ডেভিড এস

4
এসকিউএল সার্ভার ব্যবহারের নতুন সংস্করণগুলির জন্য [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()। ডাবল কোটের পরিবর্তে বর্গাকার বন্ধনীগুলি লক্ষ্য করুন।
515

4
টোগলগুলি আসলে কোনও নতুন / পুরানো সংস্করণের জিনিস নয় SET QUOTED_IDENTIFIER। আমি উত্তরটি সংশোধন করব, যেহেতু আমি যাইহোক স্কোয়ার বন্ধনী পছন্দ করি, আমি কেবল ওপি-র প্রশ্নের স্টাইলটি অনুসরণ করেছি।
ডেভিড এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.