এসকিউএল কলাম সংজ্ঞা: ডিফল্ট মান এবং নাল রিলানডেন্ট নয়?


88

আমি নীচের সিনট্যাক্সটি অনেকবার দেখেছি যা একটি ডিফলি বিবরণ তৈরি / পরিবর্তন করতে একটি কলামকে সংজ্ঞায়িত করে:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

প্রশ্নটি হ'ল: যেহেতু একটি ডিফল্ট মান নির্দিষ্ট করা থাকে, তাই কলামটি NULL গ্রহণ না করে তাও নির্দিষ্ট করা দরকার? অন্য কথায়, ডিফল্ট কি রিলান্ড্যান্ট নষ্ট করে না?

উত্তর:


133

DEFAULTএকটি মান যা সন্নিবেশ / আপডেট বিবৃতিতে সুস্পষ্ট মানের অভাবে সন্নিবেশ করা হবে। ধরে নেওয়া যাক, আপনার ডিডিএলে NOT NULLবাধা নেই:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

তাহলে আপনি এই বিবৃতি ইস্যু করতে পারে

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

অন্যথা, আপনি ব্যবহার করতে পারেন DEFAULTমধ্যে UPDATEঅনুযায়ী বিবৃতি, এসকিউএল 1992 আদর্শ:

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

দ্রষ্টব্য, সমস্ত ডাটাবেসগুলি এই এসকিউএল স্ট্যান্ডার্ড সিনট্যাক্সগুলিকে সমর্থন করে না। NOT NULLসীমাবদ্ধতা যুক্ত করা বিবৃতিতে ত্রুটি সৃষ্টি করবে 4, 6, যদিও 1-3, 5এখনও বৈধ বিবৃতি রয়েছে। সুতরাং আপনার প্রশ্নের উত্তর দিতে: না, তারা অতিরিক্ত কাজ নয়।


আমি আপনার লিঙ্কে গিয়েছিলাম (আপনার ব্লগ পোস্টে) ক্যোয়ারী পারফরম্যান্সের দুর্দান্ত প্রভাবের ব্যাখ্যা (সম্ভবত কিছু সংখ্যার সাথে) দেখার আশা করেছিলাম, তবে কেবল এটি সংক্ষিপ্তভাবে বিশ্রামে দেখেছি যে এটির প্রভাব রয়েছে। কোনও অপরাধ নয়, তবে লিঙ্কটি কিছুটা বিভ্রান্তিকর।
শেঠ ফুল

@ শেঠফ্লোয়ার্স: শেঠের পয়েন্টারটির জন্য ধন্যবাদ। এর মধ্যে লিঙ্কিত নিবন্ধটি সম্পাদিত হয়েছে। আমি পরিবর্তে অন্য কোনও লিঙ্ক করতে পারি বা লিঙ্কটি সরিয়ে ফেলব কিনা তা আমি দেখতে পাব। যেমনটি এখন, আপনি একেবারে ঠিক, এখানে উত্তরের কোনও মান যুক্ত হয় না।
লুকাশ এডার

ধন্যবাদ - আমি আশা করি আমি অসভ্য শব্দটি শুনিনি। আমি কেবল লিঙ্কটি দেখেছি এবং "হ্যাঁ, এটি অবশ্যই আমি পড়তে চাই" - এর পরে কিছুটা নামিয়ে দেওয়া হয়েছিল :)।
শেঠ ফুল

@ শেঠফ্লোয়ার্স: কোনও উদ্বেগ নেই। আমি পুরোপুরি একমত. আমার উদ্ধারের জন্য: আমার ব্লগিং দক্ষতা বিগত বছরগুলিতে ব্যাপকভাবে উন্নত হয়েছে :)
লুকাশ এডার

19

এমনকি একটি ডিফল্ট মান সহ, আপনি সর্বদা সাথে কলামের ডেটা ওভাররাইড করতে পারেন null

NOT NULLসীমাবদ্ধতা আপনি যে সারি আপডেট দেওয়া হবে না পরে এটি মাধ্যমে তৈরি করা হয়েছে nullমান


আমি মনে করি এটি পুনঃব্যবস্থাপন করা উচিত: "নূন্যতম বিধিনিষেধ আপনাকে নাল মান দিয়ে তৈরি করার পরে সেই সারিটি আপডেট করতে দেয় না" অবশ্যই নাল কলামযুক্ত সারিগুলি আপডেট করা যেতে পারে, এগুলি কেবল নাল দিয়ে আপডেট করা যাবে না যে কলামের মান। অধিকন্তু: আমি ধরে নিয়েছি যে একটি সারি তৈরি করার অর্থ একটি সারি সন্নিবেশ করা। INSERT বিবৃতিতে কলামগুলির জন্য নাল মান থাকতে পারে না যেগুলি নলের সাথে নির্দিষ্ট করা নেই।
মাক্রোম

4

মাই এসকিউএল শিক্ষক ড যে আপনি যদি উভয় একটি নির্দিষ্ট DEFAULTমান এবং NOT NULLবা NULL, DEFAULTসবসময় সামনে প্রকাশ করা উচিত NOT NULLবাNULL

এটার মত:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


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

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

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

এটি সম্ভবত প্রশ্নের উত্তর দেয় না। তবে আমি ঠিক তাই খুঁজছিলাম ধন্যবাদ.
সাসুক উচিহ

2

আমি বলব না।

যদি কলামটি নাল মান গ্রহণ করে, তবে আপনাকে ক্ষেত্রের মধ্যে নাল মান inোকানো বন্ধ করার মতো কিছুই নেই। আমি যতদূর জানি, ডিফল্ট মানটি কেবল একটি নতুন সারি তৈরির ক্ষেত্রে প্রযোজ্য।

নাল সেট না করে, আপনি ক্ষেত্রের মধ্যে নাল মান সন্নিবেশ করতে পারবেন না কারণ এটি ত্রুটি ছুঁড়ে দেবে।

শূন্যতা রোধে এটি একটি ব্যর্থ নিরাপদ প্রক্রিয়া হিসাবে ভাবেন Think


4
আপনি বলেছেন 'একটি নতুন নিয়ম তৈরি'। আপনার কি 'নতুন সারি তৈরি' বলার ইচ্ছা ছিল?
বিলাওস্কি

আমি মনে করি এটি এই প্রশ্নের আরও ব্যবহারিক উত্তর।
নোমান_ব্রাহিম

@ বিলাউসকি এবং প্রায় 8 বছর পরে, আমি সেই টাইপো সংশোধন করতে পারি :)
ডার্ক হিপ্পো

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ওপি একটি সাধারণ প্রশ্ন জিজ্ঞাসা করে এবং উত্তরটি কেবল "না"। যদিও ডকুমেন্টেশনের জন্য ব্যাখ্যা এবং উদাহরণ প্রয়োজন।
নিকোলাস হেভিয়া

0

অন্য কথায়, ডিফল্ট কি রিলান্ড্যান্ট নষ্ট করে না?

না, এটি নিরর্থক নয়। বর্ধিত গ্রহণযোগ্য উত্তর। কলামের জন্য colযা অবিস্মরণীয় বিস্ময়কর রয়েছে তা যখন ডিফল্ট সংজ্ঞায়িত করা হয় তখনও নুল সন্নিবেশ করতে পারে:

CREATE TABLE t(id INT PRIMARY KEY, col INT DEFAULT 10);

-- we just inserted NULL into column with DEFAULT
INSERT INTO t(id, col) VALUES(1, NULL);

+-----+------+
| ID  | COL  |
+-----+------+
|   1 | null |
+-----+------+

ওরাকল এই জাতীয় দৃশ্যের জন্য ডিফল্টর সাথে সুস্পষ্ট NULL ওভারাইড করার জন্য অতিরিক্ত সিনট্যাক্স প্রবর্তন করেছিল DEFAULT ON NULL:

CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10);
-- same as
--CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10 NOT NULL); 

INSERT INTO t2(id, col) VALUES(1, NULL);

+-----+-----+
| ID  | COL |
+-----+-----+
|  1  |  10 |
+-----+-----+

এখানে আমরা NULL সন্নিবেশ করানোর চেষ্টা করেছি তবে পরিবর্তে ডিফল্ট পেতে পারি।

ডিবি <> ফিডাল ডেমো

শুভ

যদি আপনি অন ন্যূনাল ধারাটি নির্দিষ্ট করে থাকেন, তারপরে ইনসার্ট স্টেটমেন্টটি নুলকে মূল্যায়ন করার জন্য একটি মান নির্ধারণ করার চেষ্টা করে তখন ওরাকল ডেটাবেস ডিফল্ট কলাম মান নির্ধারণ করে।

আপনি যখন নালকে নির্দিষ্ট করে থাকেন, নাল নন বাধা এবং অপসারণযোগ্য সীমাবদ্ধতার অবস্থা স্পষ্টভাবে নির্দিষ্ট করা হয়।

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