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

एक टेबल में कई इंसर्ट्स और कई से कई टेबल

आप यह सब एक . में कर सकते हैं 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 . से ।

विस्तृत स्पष्टीकरण :

यदि आपके पास समवर्ती लेखन . है आपको और करना पड़ सकता है। विशेष रूप से दूसरे लिंक पर विचार करें।




  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. पाठ और वर्चर के बीच अंतर (चरित्र भिन्न)

  3. प्रश्नों के भीतर प्रश्न:क्या कोई बेहतर तरीका है?

  4. पोस्टग्रेज pgadmin टूल में TX और XID भिन्नों का क्या अर्थ है

  5. पोस्टग्रेज में टाइम ज़ोन डिफॉल्ट CURRENT_TIMESTAMP के बिना फील्ड टाइमस्टैम्प के लिए जेपीए मॉडल क्लास?