আমি কি নিশ্চিত করতে পারি যে দুটি কলামের মান একই রকম নয়


11

আমার কাছে যদি এমন কোনও টেবিল থাকে যা দেখতে দেখতে এমন হয়

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

aa != bbপ্রয়োগের স্তরের যুক্তি ব্যবহার করা বা সন্নিবেশের আগে ট্রিগারকে ব্যর্থ করতে বাধ্য করার পাশাপাশি তা নিশ্চিত করার কোনও উপায় আছে কি ?

উত্তর:


3

মাইএসকিউএল CHECKসরাসরি বিপরীতে সমর্থন করে না , যদিও আপনার যদি সাম্প্রতিক পর্যায়ে যথেষ্ট সংস্করণ থাকে তবে এটি ট্রিগার এবং ত্রুটি উত্থাপনের মাধ্যমে সমর্থন করে SIGNAL, তাই আপনি সংজ্ঞা BEFORE INSERTএবং BEFORE UPDATEসীমাবদ্ধ না হলে ত্রুটি বাড়াতে পারে যা ডেটা পরীক্ষা করে এবং ত্রুটি বাড়াতে পারে।

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


9

না, আপনি পারবেন না। বেশিরভাগ ডিবিএমএসে (পোস্টগ্রিস, এসকিউএল-সার্ভার, ওরাকল, ডিবি 2 এবং আরও অনেক) আপনি কেবল একটি CHECKসীমাবদ্ধতা যুক্ত করতে পারেন :

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

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

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

বিকল্পভাবে, আপনি সীমাবদ্ধতার যত্ন নেওয়ার (সঞ্চিত) পদ্ধতিগুলির মাধ্যমে সন্নিবেশ এবং আপডেট অপারেশনগুলিকে সীমাবদ্ধ করতে পারেন এবং এটি পূরণ না করে এমন তথ্য orোকানো (বা পরিবর্তিত) করার অনুমতি দেয় না।



-1

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


1
তারপরে, বলুন আমাদের Fooটেবিলে তিনটি দম্পতি রয়েছে:(1,2) (2,3) (3,1) । আমাদের তিনটি মানকে কীভাবে ভাগ করা উচিত?
ypercubeᵀᴹ

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