মাইএসকিউএলে চেক সীমাবদ্ধতা কাজ করছে না


126

প্রথম আমি একটি টেবিল তৈরি

CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);

এবং তারপরে সেই সারণীতে মান সন্নিবেশ করানো হয়েছে

INSERT INTO Customer values ('-2','abc','zz');

মাইএসকিউএল কোনও ত্রুটি দেখায় না, এটি মানগুলি গ্রহণ করে।


আংশিকভাবে একমত। আপনি এটি ব্যবহার করার চেষ্টা করেছেন তা দেখে, ধরে নেওয়া যায় যে আপনি উভয় প্রশ্ন জিজ্ঞাসা করেছেন। আসলে, আপনি যে উত্তরটি গ্রহণ করেছেন তা মূলত এটি কেন কাজ করে না তা ব্যাখ্যা করে।
igorrs

1
আপনি এই বৈশিষ্ট্যটির অনুরোধটিতে ভোট দিতে পারেন: bugs.mysql.com/bug.php?id=3464 তবে এটি এক দশকে কোনও দৃষ্টি আকর্ষণ করেনি।
জারেড বেক

11
সংস্করণ 10.2.1 থেকে আপনি মারিয়াডিবিতে চেক সীমাবদ্ধতাগুলি ব্যবহার করতে পারেন ।
joanq

উত্তর:


140

মাইএসকিউএল 8.0.16 হ'ল প্রথম সংস্করণ যা চেক সীমাবদ্ধতাগুলিকে সমর্থন করে।

Https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html পড়ুন

আপনি যদি মাইএসকিউএল 8.0.15 বা তার আগের ব্যবহার করেন তবে মাইএসকিউএল রেফারেন্স ম্যানুয়ালটি বলে:

CHECKদফা পার্স কিন্তু সব স্টোরেজ ইঞ্জিন দ্বারা উপেক্ষা করা হয়।

একটি ট্রিগার চেষ্টা করুন ...

mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD<0 THEN 
    -> SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;

আশা করি এইটি কাজ করবে.


9
: এখানে আপনি কিভাবে পরিবর্তে একটি ত্রুটি ট্রিগার পাবেন stackoverflow.com/a/7189396/1144966
petermeissner

41
এটি হ'ল মাইএসকিউএল-এর পরিবর্তে পোস্টগ্র্রেএসকিউএল ব্যবহার করব যা-ই হোক না কেন একটি পছন্দ দেওয়ার কারণে এর বিশাল স্পার্কলি রংধনু।
রেন্ডারিয়ান

5
আমি যদি ভাব্বাদী CHECKসংজ্ঞায়িত পার্সারের মুখোমুখি হয় তবে 10 মিনিট বা 15 মিনিটের বিকাশ মাইএসকিউএলে হবে কিনা তা সতর্ক করে । আহ্, এটি খুব সোজা হবে ...
গ্যাবোর্স

75

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

একটি সহজ বিকল্প আছে

আপনি তৈরি করতে পারেন BEFORE INSERTএবং BEFORE UPDATEট্রিগার করতে পারেন যা হয় ত্রুটি সৃষ্টি করে বা ক্ষেত্রটিকে তার ডিফল্ট মানতে সেট করে যখন ডেটার প্রয়োজনীয়তা পূরণ না হয়।

BEFORE INSERTমাইএসকিউএল 5.5 এর পরে কাজ করার উদাহরণ

DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH( NEW.ID ) < 4 THEN
        SIGNAL SQLSTATE '12345'
            SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
    END IF;
END$$   
DELIMITER ;  

মাইএসকিউএল 5.5 এর আগে আপনাকে একটি ত্রুটি দেখাতে হয়েছিল, উদাহরণস্বরূপ একটি অপরিজ্ঞাত পদ্ধতিতে কল করুন।

উভয় ক্ষেত্রে এটি একটি অন্তর্নিহিত লেনদেন রোলব্যাকের কারণ হয়। মাইএসকিউএল নিজেই প্রক্রিয়া এবং ট্রিগারগুলির মধ্যে রোলব্যাক বিবৃতিটি মঞ্জুরি দেয় না।

আপনি যদি লেনদেনটি রোলব্যাক করতে না চান (INSERT / UPDATE ব্যর্থ "চেক সীমাবদ্ধতা" দিয়ে পাস করতে SET NEW.ID = NULLহবে তবে আপনি মানটি ওভাররাইট করতে পারেন যা ক্ষেত্রগুলিকে ডিফল্ট মান হিসাবে আইডি সেট করবে, কোনও আইডির জন্য সত্যিকার অর্থে বোঝায় না হউক না কেন

সম্পাদনা: বিপথগামী উদ্ধৃতি সরানো হয়েছে।

বিষয়ে :=অপারেটর:

বিপরীতে =, :=অপারেটরের তুলনা অপারেটর হিসাবে কখনও ব্যাখ্যা করা হয় না। এর অর্থ আপনি :=কোনও ভেরিয়েবলের মান নির্ধারণের জন্য কোনও বৈধ এসকিউএল স্টেটমেন্ট (কেবল এসইটি বিবৃতিতে নয়) ব্যবহার করতে পারেন ।

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

ব্যাকটিক শনাক্তকারীর উদ্ধৃতি সম্পর্কিত:

সনাক্তকারী উদ্ধৃতি চরিত্রটি ব্যাকটিক ("` ")

যদি ANSI_QUOTES এসকিউএল মোড সক্ষম করা থাকে তবে ডাবল উদ্ধৃতি চিহ্নের মধ্যে সনাক্তকারীদের উদ্ধৃতি দেওয়াও অনুমোদিত

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html


7
... খুব সহজ নয়, চেক করতে :( দুটো tutes তুলনায় অন্তত। net.tutsplus.com/tutorials/databases/... , sitepoint.com/how-to-create-mysql-triggers
বেন

এটি খুব ভারী দেখাচ্ছে। আমি মনে করি আমি বরং
অজগরটিতে একটি টিউপল

দ্রুত প্রশ্ন: এটি সেট না করে কেন কাজ করে না DELIMITER?
ddz

52

CHECK মাইএসকিউএল দ্বারা দস্তাবেজগুলিতে একটি ক্ষুদ্র মন্তব্যে বর্ণিত হিসাবে প্রতিবন্ধকতাগুলি উপেক্ষা করা হয়: CREATE TABLE

CHECKদফা পার্স কিন্তু সব স্টোরেজ ইঞ্জিন দ্বারা উপেক্ষা করা হয়।


2
@ থিফিলি: সঠিক, CHECKসীমাবদ্ধতার সঠিক প্রয়োগের সাথে অন্য ডিবিএমএসে , যদি CHECKমূল্যায়ন করা হয় FALSEতবে সন্নিবেশ (বা আপডেট) সম্পন্ন করা হয়নি এবং একটি ত্রুটি ঘটেছে।
ypercubeᵀᴹ

মারিয়াডিবিতে স্থির করা (এই উত্তরটি stackoverflow.com/a/44333349 দেখুন )।
Jérôme

@ জারুমে আমি জানি, আমার কিছু (আরও সাম্প্রতিক) উত্তর রয়েছে যার মধ্যে এই ক্ষেত্রের উন্নতি অন্তর্ভুক্ত রয়েছে (মারিয়াডিবি এবং মাইএসকিউএল উভয় ক্ষেত্রেই এই বিষয়টিকে কার্যকরী করার অন্যান্য উপায় ছিল, মারিয়াডিবি সঠিকভাবে চেকের প্রতিবন্ধকতা প্রয়োগ করার আগে)। আমি নিশ্চিত না যে আমার সমস্ত পুরানো উত্তরগুলি সম্পাদনা করা উচিত কিনা!
ypercubeᵀᴹ

আমি মনে করি একটি সাম্প্রতিক উত্তরের লিঙ্ক সহ আমার মন্তব্য ঠিক আছে is বা কিছুই চেয়ে ভাল। সম্ভবত আমার সম্পাদনা করা উচিত ছিল। আমি আপনাকে কিছু করার জন্য চাপ চাপিয়ে দেওয়ার অর্থ চাইনি।
জেরুমে


8

জোয়ানক মারিয়াডিবি দ্বারা উল্লিখিত হিসাবে এখন অন্যান্য গুডির মধ্যে CHECK বাধাগুলি সমর্থন করে বলে মনে হচ্ছে:

"চেক কনট্রন্ট ( MDEV-7563 ) এর জন্য সমর্থন" "

https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/


1

8.0.15 সংস্করণ হিসাবে চেক সীমাবদ্ধতাগুলি সমর্থিত (এখনও প্রকাশ করা হয়নি)

https://bugs.mysql.com/bug.php?id=3464

[23 জানুয়ারী 16:24] পল দুবাইস

বিকাশকারী পোস্ট করেছেন: 8.0.15 এ স্থির।

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


1

মাইএসকিউএল 8.0.16 আপডেট করার জন্য ব্যবহার করুন checks:

মাইএসকিউএল ৮.০.১6 হিসাবে, ক্রেট টেবিলটি সমস্ত স্টোরেজ ইঞ্জিনগুলির জন্য সারণী এবং কলাম চেক সীমাবদ্ধতার মূল বৈশিষ্ট্যগুলিকে অনুমতি দেয়। সারণি সীমাবদ্ধতা এবং কলাম উভয় সীমাবদ্ধতার জন্য তৈরি টেবিলটি নিম্নলিখিত চেক সীমাবদ্ধতা সিনট্যাক্সকে অনুমতি দেয়

মাইএসকিউএল ডকুমেন্টেশন চেক করে


-2

set sql_mode = 'STRICT_TRANS_TABLES'OR দিয়ে চেষ্টা করুন trySET sql_mode='STRICT_ALL_TABLES'


2
যে অ্যাক্টুয়াল সাহায্য করে না (মাইএসকিউএল ৫..6) এটি মিথ্যা টাইপের ডেটা প্রবেশ করা বাধা দেয় না এমন CHECKসীমাবদ্ধতা পূরণ না করে এমন ডেটা প্রবেশ করা থেকে
বিরত রাখে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.