Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL क्रॉस टेबल बाधा

आप एक "प्रकार" तालिका का उपयोग कर सकते हैं:

CREATE TABLE Type
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

ठीक 2 पंक्तियों के साथ (जितनी अलग-अलग उपप्रकार तालिकाएँ आपको चाहिए:

INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;

सुपरटेप टेबल (जिसमें "टाइप" का संदर्भ देने वाला कॉलम शामिल है):

CREATE TABLE A
  ( a_id INT NOT NULL AUTO_INCREMENT
  , type_code CHAR(1) NOT NULL
  , PRIMARY KEY (a_id)
  , UNIQUE KEY (type_code, a_id)
  , FOREIGN KEY (type_code)
      REFERENCES Type (type_code)
  ) ;

उपप्रकार सारणी (जो अब A की प्राथमिक कुंजी और type_code के संयोजन को संदर्भित कर रही हैं:

CREATE TABLE B
  ( a_id INT NOT NULL
  , type_code CHAR(1) NOT NULL DEFAULT 'B'
  , PRIMARY KEY (type_code, a_id)
  , FOREIGN KEY (type_code, a_id)
      REFERENCES A (type_code, a_id)
  , CHECK (type_code = 'B')
  ) ;

CREATE TABLE C
  ( a_id INT NOT NULL
  , type_code CHAR(1) NOT NULL DEFAULT 'C'
  , PRIMARY KEY (type_code, a_id)
  , FOREIGN KEY (type_code, a_id)
      REFERENCES A (type_code, a_id)
  , CHECK (type_code = 'C')
  ) ;

उपरोक्त ठीक काम करेगा, अगर केवल MySQL ने CHECK . को लागू किया होता प्रतिबंध। लेकिन ऐसा नहीं हुआ है। इसलिए, यह सुनिश्चित करने के लिए कि आपके सभी विनिर्देश लागू हैं, न कि 'B' प्रकार डेटा C . में डाला जाता है तालिका, आपको 2 और "प्रकार" तालिकाएँ जोड़नी होंगी (और MySQL में बेकार को हटा दें CHECK बाधाएं):

CREATE TABLE TypeB
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

CREATE TABLE TypeC
  ( type_code CHAR(1) NOT NULL
  , PRIMARY KEY (type_code)
  ) ;

ठीक 1 पंक्तियों के साथ:

INSERT INTO TypeB (type_code)
VALUES ('B') ;

INSERT INTO TypeC (type_code)
VALUES ('C') ;

और अतिरिक्त FK:

ALTER TABLE B
  ADD FOREIGN KEY (type_code)
    REFERENCES TypeB (type_code) ;

ALTER TABLE C
  ADD FOREIGN KEY (type_code)
    REFERENCES TypeC (type_code) ;

इन बाधाओं के साथ, तालिका A की प्रत्येक पंक्ति या तो B या C प्रकार की होगी और यह संबंधित तालिका (B या C) में होगी और दोनों में कभी नहीं।

यदि आप यह भी सुनिश्चित करना चाहते हैं कि वे बिल्कुल एक तालिका में होंगे (और न तो बी और न ही सी में), तो ए में डालने पर ध्यान रखा जाना चाहिए (सभी प्रविष्टियां उस लेनदेन के साथ की जानी चाहिए जो उस आवश्यकता को लागू करती है)।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सिम्फनी 2 सिद्धांत पीडीओ MySQL कनेक्शन लोड डेटा स्थानीय इनफाइल के साथ

  2. पायथन मुद्दा:vcvarsall.bat को खोजने में असमर्थ

  3. mysql लेनदेन - मिश्रण डालने और last_insert_id प्राप्त करने के लिए चयन करें?

  4. दूसरा उच्चतम वेतन सर्वोत्तम संभव तरीके खोजें

  5. MySQL अद्यतन एक रिकॉर्ड का पहला उदाहरण