यह परेशानी की भीख मांग रहा है। आप छोटी-मोटी असंगतियों में भागते रहेंगे। या बहुत बाद में, जब नुकसान हो जाता है, तब तक उन्हें नोटिस भी नहीं करते। ऐसा न करें। स्थानीय रूप से भी PostgreSQL का उपयोग करें। यह अधिकांश ओएस के लिए स्वतंत्र रूप से उपलब्ध है। "डेटाबेस कोर्स प्रोजेक्ट" में शामिल किसी व्यक्ति के लिए यह एक आश्चर्यजनक मूर्खता है। संबंधित:
अन्य सलाह:
-
जैसा कि @Priidu ने कमेंट में उल्लेख किया है , आपकी विदेशी कुंजी बाधाएं पीछे की ओर हैं। यह बहस के लिए नहीं है, वे बस गलत हैं ।
-
PostgreSQL में
serial
. का उपयोग करें याIDENTITY
SQLiteAUTOINCREMENT
. के बजाय कॉलम (पोस्टग्रेस 10+) . देखें: -
timestamp
का इस्तेमाल करें (याtimestamptz
)datetime
. के बजाय । -
मिश्रित केस पहचानकर्ताओं का उपयोग न करें।
-
id
. जैसे गैर-वर्णनात्मक कॉलम नामों का उपयोग न करें . कभी। यह अर्ध-बुद्धि मिडलवेयर और ओआरएम द्वारा पेश किया गया एक विरोधी पैटर्न है। जब आप कुछ तालिकाओं में शामिल होते हैं तो आपके पासid
. नाम के अनेक स्तंभ होते हैं . यह सक्रिय रूप से हानिकारक है। -
कई नामकरण शैलियाँ हैं, लेकिन अधिकांश सहमत हैं कि एकवचन शब्दों को तालिका नामों के रूप में रखना बेहतर है। यह छोटा है और कम से कम सहज/तार्किक है।
label
, नहींlabel
.
सब कुछ एक साथ रखा, यह इस तरह दिख सकता है:
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
।