आप यह सब एक . में कर सकते हैं CTE का उपयोग करते हुए SQL कमांड।
पोस्टग्रेज मानते हुए 9.6 और यह क्लासिक कई-से-अनेक स्कीमा (चूंकि आपने इसे प्रदान नहीं किया था):
CREATE TABLE questions (
question_id serial PRIMARY KEY
, title text NOT NULL
, body text
, userid int
, categoryid int
);
CREATE TABLE tags (
tag_id serial PRIMARY KEY
, tag text NOT NULL UNIQUE);
CREATE TABLE questiontags (
question_id int REFERENCES questions
, tag_id int REFERENCES tags
, PRIMARY KEY(question_id, tag_id)
);
एक एकल सम्मिलित करने के लिए प्रश्न टैग की सरणी . के साथ :
WITH input_data(body, userid, title, categoryid, tags) AS (
VALUES (:title, :body, :userid, :tags)
)
, input_tags AS ( -- fold duplicates
SELECT DISTINCT tag
FROM input_data, unnest(tags::text[]) tag
)
, q AS ( -- insert question
INSERT INTO questions
(body, userid, title, categoryid)
SELECT body, userid, title, categoryid
FROM input_data
RETURNING question_id
)
, t AS ( -- insert tags
INSERT INTO tags (tag)
TABLE input_tags -- short for: SELECT * FROM input_tags
ON CONFLICT (tag) DO NOTHING -- only new tags
RETURNING tag_id
)
INSERT INTO questiontags (question_id, tag_id)
SELECT q.question_id, t.tag_id
FROM q, (
SELECT tag_id
FROM t -- newly inserted
UNION ALL
SELECT tag_id
FROM input_tags JOIN tags USING (tag) -- pre-existing
) t;
dbfiddle यहां
यह कोई भी टैग बनाता है जो अभी तक मौजूद नहीं है।
पोस्टग्रेज सरणी . का टेक्स्ट प्रस्तुतिकरण ऐसा दिखता है:{tag1, tag2, tag3}
।
अगर इनपुट ऐरे में अलग-अलग टैग होने की गारंटी है, तो आप DISTINCT
. को हटा सकते हैं CTE input_tags
. से ।
विस्तृत स्पष्टीकरण :
- Postgres का उपयोग करके एक बार में 3 तालिकाओं में डेटा सम्मिलित करें
- PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?
- PostgreSQL में अनेक-से-अनेक संबंध कैसे कार्यान्वित करें?
- प्रवेश नहीं कर सकता:त्रुटि:सरणी मान "{" या आयाम जानकारी से प्रारंभ होना चाहिए
यदि आपके पास समवर्ती लेखन . है आपको और करना पड़ सकता है। विशेष रूप से दूसरे लिंक पर विचार करें।