অবিচ্ছিন্নভাবে তাত্ক্ষণিকভাবে ডিফেরাবল নয়


92

আমি DEFERRABLEএটি ডাটাবেস সিস্টেমে এসকিউএল কীওয়ার্ড - সম্পূর্ণ পুস্তক সম্পর্কে পড়েছি ।

পরবর্তী [ডিফারবেল নয়] ডিফল্ট এবং এর অর্থ হ'ল প্রতিবার কোনও ডাটাবেস সংশোধনী বিবৃতি কার্যকর করা হয়, ততক্ষণে এই সীমাবদ্ধতাটি পরীক্ষা করা হয়, যদি এই পরিবর্তনটি বিদেশী-কী সীমাবদ্ধতা লঙ্ঘন করতে পারে।

যাইহোক, আমরা যদি কোনও প্রতিবন্ধকে অপ্রয়োজনীয় বলে ঘোষণা করি তবে সীমাবদ্ধতা যাচাইয়ের আগে কোনও লেনদেন শেষ না হওয়া পর্যন্ত আমাদের অপেক্ষা করার বিকল্প রয়েছে।

আমরা শব্দ অনুসরণ DEFERRABLE হয় এর থেকেই আমি বিলম্বিত বা থেকেই আমি অবিলম্বে । পূর্ববর্তী ক্ষেত্রে, প্রতিটি লেনদেন শুরুর আগে চেকিং পিছিয়ে দেওয়া হবে। পরবর্তী ক্ষেত্রে, প্রতিটি বিবৃতি দেওয়ার পরে অবিলম্বে চেক করা হবে।

এর NOT DEFERRABLEথেকে আলাদা কীভাবে DEFERRABLE INITIALLY IMMEDIATE? উভয় ক্ষেত্রেই, মনে হয়, প্রতিটি স্বতন্ত্র বক্তব্যের পরে কোনও বাধা পরীক্ষা করা হয়।

উত্তর:


74

সঙ্গে DEFERRABLE INITIALLY IMMEDIATEযখন আপনি এটি প্রয়োজন আপনি চাহিদা সীমাবদ্ধতার মুলতবি পারবেন না।

আপনি যদি সাধারণভাবে বিবৃতি দেওয়ার সময় সীমাবদ্ধতাগুলি পরীক্ষা করতে চান তবে এটি দরকারী।

সীমাবদ্ধতাগুলি কীভাবে স্থগিত করা যায় তা সিনট্যাক্স যদিও বিভিন্ন ডিবিএমএসের জন্য আলাদা।

আপনার সাথে NOT DEFERRABLEকখনই প্রতিশ্রুতিবদ্ধ সময় না হওয়া পর্যন্ত চেকিং স্থগিত করতে সক্ষম হবেন না।


4
@ ক্রমিনস: DEFERRABLEডিজাইনারের অভিপ্রায় উল্লেখ করেছে যে সীমাবদ্ধতা পিছিয়ে দেওয়া সার্থক বা প্রয়োজনীয় পদক্ষেপ। এটি বেশিরভাগ ডাটাবেসের সীমাবদ্ধতার ক্ষেত্রে নয় এবং সমস্ত যেমন লেবেল করা DEFERRABLEএই দরকারী পার্থক্যটি হারাবে।
onedaywhen

4
@ মাউন্টেউহেন আমার একজন সহকর্মী তার পর থেকে একটি ভাল বৈধ কারণ চিহ্নিত করেছেন, আসলে: আপনি যে কোনও লেনদেনের যে কোনও সময়ে অ-স্থলিত বাধাগুলির উপর নির্ভর করতে পারেন, তবে পিছিয়ে পড়াগুলি কেবলমাত্র লেনদেনের শুরুতে লক্ষ্য করা যায়।
রোমান স্টারকভ

@ রোমান স্টারকভ এছাড়াও, এটি পারফরম্যান্সের বিষয়। NOT DEFERRABLEসাধারণত দ্রুততম হয়।
তেজয়

50

অন্যান্য (সঠিক) উত্তরগুলি বাদ দিয়ে, পোস্টগ্রেএসকিউএল-এর কথা বলার সময় অবশ্যই তা উল্লেখ করা উচিত:

  • সঙ্গে নয় DEFERRABLE প্রতিটি সারির সন্নিবেশ / আপডেট সময়ে পরীক্ষা করা হয়

  • সঙ্গে DEFERRABLE (বর্তমানে অবিলম্বে ) সব সারি সন্নিবেশ / আপডেট শেষে পরীক্ষিত হয়

  • সঙ্গে DEFERRABLE (বর্তমানে বিলম্বিত ) সব সারি লেনদেন শেষে পরীক্ষিত হয়

সুতরাং এটি বলা ঠিক হবে না যে একটি কার্যকর বাধা যখন তা অবিলম্বে সেট করা থাকে তখন একটি DEFERRABLE এর মতো কাজ করে।


এই পার্থক্যটি বিস্তারিতভাবে বর্ণনা করা যাক:

CREATE TABLE example(
    row integer NOT NULL,
    col integer NOT NULL,
    UNIQUE (row, col) DEFERRABLE INITIALLY IMMEDIATE
);

INSERT INTO example (row, col) VALUES (1,1),(2,2),(3,3);

UPDATE example SET row = row + 1, col = col + 1;

SELECT * FROM example;

এটি সঠিকভাবে ফলাফল:

আউটপুট

তবে আমরা যদি অবিলম্বে তাত্পর্যপূর্ণ দিকনির্দেশকে মুছে ফেলি,

ত্রুটি: ডুপ্লিকেট কী মানটি অনন্য বাধা লঙ্ঘন করে "উদাহরণ_রো_কোল_কি" বিবরণ: কী ("সারি", কল) = (2, 2) ইতিমধ্যে বিদ্যমান। ********** ত্রুটি **********

ত্রুটি: সদৃশ কী মানটি অনন্য বাধা লঙ্ঘন করে "উদাহরণ_row_col_key" এসকিউএল রাষ্ট্র: 23505 বিশদ: কী ("সারি", কল) = (2, 2) ইতিমধ্যে বিদ্যমান।


যোগ করুন (অক্টোবর 12, 2017)

এই আচরণটি এখানে প্রকৃতপক্ষে নথিভুক্ত করা হয়েছে , বিভাগ "সামঞ্জস্য":

এছাড়াও, পোস্টগ্রেএসকিউএল স্ট্যান্ডার্ডের পরামর্শ অনুসারে বিবৃতি শেষে নয়, অবিলম্বে অ-স্থলযোগ্য স্বতন্ত্রতা সীমাবদ্ধতাগুলি পরীক্ষা করে।


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

4
হ্যাঁ, মূলত অগ্রাধিকার দেওয়ার একমাত্র কারণ NOT DEFERRABLEহ'ল গতি ( এখানে দেখুন বিভাগটি অ-স্থগিত করা স্বতন্ত্রতা সীমাবদ্ধতা , "সচেতন থাকুন যে এটি তাত্ক্ষণিক স্বতন্ত্রতা পরীক্ষা করার চেয়ে উল্লেখযোগ্যভাবে ধীর হতে পারে" )।
তেজয়

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

4
থাম্বের নিয়ম হিসাবে, যদি প্রতিবন্ধকতাটি পরীক্ষা করা হয় তখন যদি এটি ব্যবসায়ের যুক্তিটির সাথে সত্যিই কিছু যায় আসে না, তবে NOT DEFERRABLEকেবলমাত্র এটি আরও ভাল সম্পাদন করার কারণে আমি ডিফল্ট করব ?
ডিভিটান

4
আমাদের ওআরএম-এ আমরা এখন নিম্নলিখিত বিধিগুলি ব্যবহার করি: 1) সীমাবদ্ধতা যদি কোনও পিকে হয় তবে আমরা NOT DEFERRABLE2 ব্যবহার করি ) যদি কমপক্ষে একটি এফকে সীমাবদ্ধতার উল্লেখ করে তবে আমরা NOT DEFERRABLEঅন্যান্য ক্ষেত্রেও 3 ব্যবহার করি ) DEFERRABLE INITIALLY IMMEDIATE। এটি এই সীমাবদ্ধতার পারফরম্যান্সকে কিছুটা হ্রাস করতে পারে তবে আমরা অন্যান্য ডিবিএমএসের সাথে সর্বাধিক সামঞ্জস্যতা নিশ্চিত করি (ওরাকল, স্ক্যালসার্ভার)। পিকে এবং এফকে কোনও সমস্যা নয় কারণ আমরা কখনই তাদের মানগুলি আপডেট করি না (যা আমি মনে করি যে এটি ডিবিদের জন্য একটি ভাল প্রোগ্রামিং অভ্যাস)।
তেজয়

29

স্থগিত করতে সক্ষম হওয়ার স্পষ্টতাকে বাদ দিয়ে, পার্থক্যটি আসলে পারফরম্যান্স। যদি কোনও পারফরম্যান্স পেনাল্টি না থাকে তবে মুলতুবি বা পছন্দসই বাছাই করার বিকল্প থাকার দরকার ছিল না - সমস্ত সীমাবদ্ধতা কেবল মুলতবি হতে পারে।

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


7

আমি পার্টিতে খুব দেরী করেছি তবে আমি এটি যুক্ত করতে চেয়েছিলাম - 2018 এর ডিসেম্বর হিসাবে - আমি জানি কেবলমাত্র দুটি ডাটাবেস (আরও বেশি থাকতে পারে) এই স্ট্যান্ডার্ড এসকিউএল বৈশিষ্ট্যটির কিছু স্তর বাস্তবায়নের প্রস্তাব দেয় :

Database    NOT DEFERRABLE  DEFERRABLE           DEFERRABLE 
                            INITIALLY IMMEDIATE  INITIALLY DEFERRED
----------  --------------  -------------------  ------------------
Oracle      N/A *1          Yes (default)        Yes
PostgreSQL  Yes (default)   Yes                  Yes
DB2         -               -                    -
SQL Server  -               -                    -
MySQL       -               -                    -
MariaDB     -               -                    -
SAP Sybase  -               -                    -
HyperSQL    -               -                    -
H2          -               -                    -
Derby       -               -                    -

* 1 যদিও ওরাকল 12 সি NOT DEFERRABLE সীমাবদ্ধ অবস্থাটি স্বীকার করে , এটি আসলে এটিকে উপেক্ষা করে এবং এটিকে কাজ করে তোলে DEFERRABLE INITIALLY IMMEDIATE

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

মজার বিষয় হল যথেষ্ট ওরাকল এবং পোস্টগ্রিসকিউএল আলাদা ডিফল্ট টাইপ রয়েছে। সম্ভবত এটির কার্যকারিতা জড়িত।


4

স্থগিতযোগ্য নয় - আপনি সীমাবদ্ধতা চেকিং পরিবর্তন করতে পারবেন না, প্রতিটি বিবৃতি দেওয়ার পরে ওরাকল এটি পরীক্ষা করে (অর্থাত্ সরাসরি statementোকানোর বিবৃতি দেওয়ার পরে)।

অবিলম্বে অবিলম্বে কার্যকরী - প্রতিটি বিবৃতি পরে ওরাকল চেক সীমাবদ্ধতা। কিন্তু, আপনি প্রতিটি লেনদেনের পরে এটিকে পরিবর্তন করতে পারেন (অর্থাত কমিট করার পরে):

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