একটি বিদেশী কী সহ টেবিল কলামগুলি কি নুল হতে পারে?


235

আমার কাছে একটি টেবিল রয়েছে যাতে অন্যান্য টেবিলে বেশ কয়েকটি আইডি কলাম রয়েছে।

আমি যদি সেখানে ডেটা রাখি তবেই সততা জোর করার জন্য আমি একটি বিদেশী কী চাই । আমি যদি এই কলামটি জনপ্রিয় করার জন্য পরবর্তী সময়ে একটি আপডেট করি, তবে এটির সীমাবদ্ধতাও পরীক্ষা করা উচিত।

(এটি সম্ভবত ডাটাবেস সার্ভার নির্ভর, আমি মাইএসকিউএল এবং ইনোডিবি টেবিল প্রকার ব্যবহার করছি)

আমি বিশ্বাস করি এটি একটি যুক্তিসঙ্গত প্রত্যাশা, তবে আমি ভুল হলে আমাকে সংশোধন করুন।


6
আমি মাইএসকিউএল সম্পর্কে জানি না, তবে এমএস এসকিউএল সার্ভার বিদেশী কীগুলি আপনাকে চাইলে যে শব্দার্থতাত্ত্বিক চায় সেগুলি দিয়ে মঞ্জুরি দেয়। আমি আশা করি এটি স্ট্যান্ডার্ড আচরণ।
জেফ্রি এল হাইটলেজ

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

উত্তর:


245

হ্যাঁ, আপনি কেবল তখনই সীমাবদ্ধতা প্রয়োগ করতে পারবেন যখন মানটি NULL নয়। এটি নিম্নলিখিত উদাহরণ দিয়ে সহজেই পরীক্ষা করা যেতে পারে:

CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                    parent_id INT NULL,
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)


INSERT INTO child (id, parent_id) VALUES (2, 1);

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
-- (`parent_id`) REFERENCES `parent` (`id`))

প্রথম সন্নিবেশ পাস হবে কারণ আমরা একটিতে NUL সন্নিবেশ করি parent_id। বিদেশী কী বাধা থাকার কারণে দ্বিতীয় সন্নিবেশ ব্যর্থ হয়েছে, যেহেতু আমরা parentসারণীতে অস্তিত্ব নেই এমন একটি মান সন্নিবেশ করার চেষ্টা করেছি ।


16
অভিভাবক সারণীটি আইডি INT NULL দিয়েও ঘোষণা করা যেতে পারে।
উইল

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

1
আমি মনে করি parent_id INT NULLঅংশটি (verbosely) সমানparent_id int default null

জাভা ব্যবহারকারীদের পক্ষে সাইড নোট, আপনি যদি ক্লাসের সদস্যদের intপরিবর্তে আইবটিস বা অন্যান্য ওআরএম ব্যবহার করেন এবং আদিম ব্যবহার করেন Integerতবে ডিফল্টটি কখনই বাতিল হবে না, তবে 0 হবে এবং আপনি সীমাবদ্ধতা ব্যর্থ করবেন।
জিম ফোর্ড

32

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


8
আপনি কি কলামে NUL এর ডিফল্ট মান সেট করতে পারবেন না?
কেভিন কলম্বে

হ্যাঁ, বেশিরভাগ ভাষায় NULL একটি খালি স্ট্রিংয়ের চেয়ে আলাদা। শুরু করার সময় সম্ভবত সূক্ষ্ম, তবে মনে রাখা সমালোচনাযোগ্য।
গ্যারি

আরে ব্যাকস্লাইডার, আপনি "(একটি ফাঁকা স্ট্রিংয়ের বিপরীতে)" বলেছিলেন, তবে আমি মনে করি না যে আপনি বোঝাতে চেয়েছিলেন যে আপনি খালি স্ট্রিংয়ের একটি মান লিখবেন, বরং এটি যে আপনি মানটির জন্য কোনও মান নির্দিষ্ট করেন না সবাই? অর্থাৎ আপনি নিজের কলামটিও উল্লেখ করেন না INSERT INTO {table} {list_of_columns}? কারণ এটি আমার পক্ষে সত্য; কলামটির উল্লেখ বাদ দেওয়া ত্রুটি ঘটায়, তবে NULL সংশোধন ত্রুটি সহ এবং স্পষ্টভাবে সেট করা। আমি যদি সঠিক হয় তবে আমার মনে হয় @ গ্যরির মন্তব্যটি প্রয়োগ হয় না (কারণ আপনি খালি স্ট্রিং বোঝাতে পারেন নি), তবে @ কেভিন কুলম্বের সহায়ক হতে পারে ...
দ্য রেড মটর

হ্যাঁ, @ KevinCoulombe এর পরামর্শ কাজ, আমি কিভাবে সত্তা ফ্রেমওয়ার্ক কোর এর মাইগ্রেশন স্ক্রিপ্ট, সঙ্গে এই অর্জন করার বর্ণনা এখানে
রেড মটর

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

4

হ্যাঁ, এটি আপনার প্রত্যাশা মতো কাজ করবে work দুর্ভাগ্যক্রমে, মাইএসকিউএল ম্যানুয়ালটিতে এর একটি স্পষ্ট বিবৃতি পেতে আমার সমস্যা হচ্ছে বলে মনে হচ্ছে ।

বিদেশী কীগুলির অর্থ অন্য টেবিলের মধ্যে মান অবশ্যই বিদ্যমান। NULL মান অনুপস্থিতি বোঝায়, সুতরাং যখন আপনি NULL এ একটি কলাম সেট করবেন তখন তাতে সীমাবদ্ধতা প্রয়োগ করার চেষ্টা করা বুদ্ধিমান হবে না।


ডিজাইনের মাধ্যমে বিদেশী কী অবশ্যই এমন কিছু কী (প্রাথমিক) উল্লেখ করতে হবে যা শূন্য নয়, তবে বিকাশের পর্যায়ে যখন আমাদের একাধিক ডেটা প্রথমে শিশু টেবিলের মধ্যে toোকানো প্রয়োজন, যা আমরা জানি না যে এটি কাকে নির্দেশ করবে (প্যারেন্ট টেবিল) । এজন্য আমাদের নুল মান অনুমোদিত allowed উত্পাদনে NULL থাকবে একটি ডিজাইনের প্রবাহ, এটি মোটামুটিভাবে বলা যেতে পারে।
বিমল কৃষ্ণ

2

উপরের কাজ করে কিন্তু এটি হয় না। মুছে ফেলা ক্যাসকেডটি নোট করুন

CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                 PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                parent_id INT NULL,
                FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE

) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)

4
'উপরের' বলতে কী বোঝ? মনে রাখবেন যে আপনি যদি অন্য একটি উত্তর উল্লেখ করছেন তবে অর্ডার পরিবর্তন হতে পারে।
d219

2

হ্যাঁ, মানটি নুল হতে পারে তবে আপনাকে অবশ্যই স্পষ্ট করতে হবে। আমি আগেও এই একই পরিস্থিতিটি অনুভব করেছি এবং কেন ঘটে যায় তা ভুলে যাওয়া সহজ, এবং তাই কী করা দরকার তা মনে রাখতে একটু সময় লাগে।

যদি জমা দেওয়া ডেটাটি খালি স্ট্রিং হিসাবে কাস্ট করা বা ব্যাখ্যা করা হয় তবে এটি ব্যর্থ হবে। যাইহোক, INSERTING বা আপডেট করার সময় স্পষ্টভাবে NULL এ মান সেট করে আপনি ভাল good

তবে এটি প্রোগ্রামিংয়ের মজা, তাই না? আমাদের নিজস্ব সমস্যা তৈরি করা এবং তারপরে সেগুলি ঠিক করা! চিয়ার্স!


1

এর অন্য একটি উপায় হ'ল অন্য সারণীতে একটি ডিফল্ট উপাদান .োকানো। উদাহরণস্বরূপ, অন্য টেবিলের uuid = 00000000-0000-0000-0000-00000000000000 এর কোনও রেফারেন্স কোনও পদক্ষেপের ইঙ্গিত দিবে না। আপনার আইডিকে "নিরপেক্ষ" হওয়ার জন্য আপনাকে সমস্ত মানও নির্ধারণ করতে হবে, যেমন 0, খালি স্ট্রিং, আপনার কোড যুক্তিকে প্রভাবিত করতে না পারে ull


2
এটি একই জিনিস নয়। একটি ডিফল্ট বা "নিরপেক্ষ" মান NULL এর মতো নয়, একটি মানের অনুপস্থিতি। কোনও এনএলএল-র উপরে ডিফল্ট মানের যোগ্যতা নিয়ে আলোচনা না করেই আপনার ফ্রেসিংটি একটি লিট্ট মিশ্রিত। "এর অন্য একটি উপায়
হ'ল

0

আমিও এই ইস্যুতে আটকেছি। তবে আমি কেবল বিদেশী কী হিসাবে সংজ্ঞা দিয়ে সমাধান করেছি unsigned integer। নীচের উদাহরণটি সন্ধান করুন-

CREATE TABLE parent (
   id int(10) UNSIGNED NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id int(10) UNSIGNED NOT NULL,
    parent_id int(10) UNSIGNED DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.