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

कई-से-अनेक संबंधों में विदेशी कुंजी बाधाएं

यह परेशानी की भीख मांग रहा है। आप छोटी-मोटी असंगतियों में भागते रहेंगे। या बहुत बाद में, जब नुकसान हो जाता है, तब तक उन्हें नोटिस भी नहीं करते। ऐसा न करें। स्थानीय रूप से भी PostgreSQL का उपयोग करें। यह अधिकांश ओएस के लिए स्वतंत्र रूप से उपलब्ध है। "डेटाबेस कोर्स प्रोजेक्ट" में शामिल किसी व्यक्ति के लिए यह एक आश्चर्यजनक मूर्खता है। संबंधित:

अन्य सलाह:

सब कुछ एक साथ रखा, यह इस तरह दिख सकता है:

CREATE TABLE IF NOT EXISTS post (
   post_id   serial PRIMARY KEY
 , author_id integer
 , title     text
 , content   text
 , image_url text
 , date      timestamp
);

CREATE TABLE IF NOT EXISTS label (
   label_id  serial PRIMARY KEY
 , name      text UNIQUE
);

CREATE TABLE IF NOT EXISTS label_post(
    post_id  integer REFERENCES post(post_id) ON UPDATE CASCADE ON DELETE CASCADE
  , label_id integer REFERENCES label(label_id) ON UPDATE CASCADE ON DELETE CASCADE
  , PRIMARY KEY (post_id, label_id)
);

ट्रिगर

अप्रयुक्त लेबल हटाने के लिए, एक ट्रिगर लागू करें . मैं एक और संस्करण प्रदान करता हूं क्योंकि मैं @Priidu द्वारा प्रदान किए गए संस्करण से खुश नहीं हूं। :

CREATE OR REPLACE FUNCTION f_trg_kill_orphaned_label() 
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   DELETE FROM label l
   WHERE  l.label_id = OLD.label_id
   AND    NOT EXISTS (
      SELECT 1 FROM label_post lp
      WHERE  lp.label_id = OLD.label_id
      );
END
$func$;
  • ट्रिगर फ़ंक्शन पहले . बनाया जाना चाहिए ट्रिगर

  • एक आसान DELETE आदेश काम कर सकता है। किसी दूसरी क्वेरी की आवश्यकता नहीं है - विशेष रूप से नहीं count(*) . EXISTS सस्ता है।

  • भाषा के नाम के चारों ओर एकल-उद्धरण सहन किए जाते हैं, लेकिन यह वास्तव में एक पहचानकर्ता है, इसलिए केवल बकवास को छोड़ दें:LANGUAGE plpgsql

CREATE TRIGGER label_post_delaft_kill_orphaned_label
AFTER DELETE ON label_post
FOR EACH ROW EXECUTE PROCEDURE f_trg_kill_orphaned_label();

कोई CREATE OR REPLACE TRIGGER . नहीं है PostgreSQL में, अभी तक। बस CREATE TRIGGER



  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. Postgresql में केस-असंवेदनशील क्वेरी कैसे बनाएं?

  3. जब एक भी बाधा विफल हो जाती है तो मैं PostgreSQL को पूरे लेनदेन को रद्द नहीं करने के लिए कैसे कह सकता हूं?

  4. मेरी क्वेरी में विभाजन और COUNT का परिणाम हमेशा 1 क्यों होता है?

  5. पोस्टग्रेज डीबी में बड़ी संख्या में आईडी का उपयोग करके Django क्वेरी फ़िल्टर