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

मैं असंबंधित तालिकाओं के बीच अखंडता कैसे सुनिश्चित करूं?

आप इसे नियंत्रित अतिरेक और समग्र FK बाधाओं का उपयोग करके कर सकते हैं:

CREATE TABLE offr (
    offr_id INT NOT NULL,
    coy_id INT NOT NULL,
    PRIMARY KEY (offr_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id),
    UNIQUE KEY (offr_id, coy_id)
);

मैंने subscribe पर एक समग्र FK बाधा का समर्थन करने के लिए एक समग्र अद्वितीय कुंजी (offr_id, coy_id) जोड़ा टेबल।

CREATE TABLE provide (
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (coy_id, type_id),
    FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id)
);

यहां समग्र प्राथमिक कुंजी subscribe . पर समग्र FK बाधा के लिए एकदम सही है टेबल।

CREATE TABLE subscribe (
    naf_no INT NOT NULL,
    coy_id INT NOT NULL,
    type_id INT NOT NULL,
    PRIMARY KEY (naf_no, type_id),
    FOREIGN KEY (naf_no, coy_id) REFERENCES offr (offr_id, coy_id),
    FOREIGN KEY (coy_id, type_id) REFERENCES provide (coy_id, type_id)
);

समग्र एफके बाधाओं को ओवरलैप करने से यह सुनिश्चित होगा कि एक अधिकारी केवल उस कंपनी द्वारा प्रस्तावित बीमा की सदस्यता ले सकता है जिसमें वह नामांकित है। coy_id तार्किक रूप से बेमानी है लेकिन अखंडता के लिए आवश्यक है और FK बाधाओं के कारण अद्यतन विसंगतियों का कोई जोखिम नहीं है।

वैकल्पिक रूप से, आप यह जांचने के लिए ट्रिगर का उपयोग कर सकते हैं कि मान आंतरिक जुड़ाव के माध्यम से संबंधित हैं:

CREATE TRIGGER check_subscribe BEFORE INSERT OR UPDATE ON subscribe
FOR EACH ROW
WHEN NOT EXISTS (
    SELECT 1
    FROM offr
    INNER JOIN provide ON offr.coy_id = provide.coy_id
    WHERE offr.offr_id = new.naf_no AND provide.type_id = new.type_id
)
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Officers can only subscribe to types provided by their company');

अस्वीकरण:मैं SqlFiddle पर इसका परीक्षण करने में असमर्थ था और Oracle स्थापित नहीं है, लेकिन उम्मीद है कि यह आपको सही दिशा में इंगित करेगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या Oracle ALTER स्टेटमेंट में सबक्वेरी का उपयोग किया जा सकता है?

  2. JDBC बैच इंसर्ट अपवाद हैंडलिंग

  3. SqlDeveloper:नेटवर्क उपनाम सूची साफ़ करें

  4. Oracle SQL - स्ट्रिंग से आंशिक डुप्लिकेट हटाएं

  5. परीक्षण के लिए एचएसक्यूएल में लापता अनुक्रम