PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wiele WSTAWEK w jednym stole i wiele do wielu tabel

Możesz to wszystko zrobić w jednym Polecenie SQL przy użyciu CTE.

Zakładając Postgres 9.6 i ten klasyczny schemat wiele-do-wielu (ponieważ go nie podałeś):

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)
);

Aby wstawić singiel pytanie z tablicą tagów :

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 tutaj

Spowoduje to utworzenie w locie wszelkich tagów, które jeszcze nie istnieją.

Tekstowa reprezentacja tablicy Postgres wygląda tak:{tag1, tag2, tag3} .

Jeśli tablica wejściowa na pewno ma różne znaczniki, możesz usunąć DISTINCT z CTE input_tags .

Szczegółowe wyjaśnienie :

Jeśli masz równoczesne zapisy być może będziesz musiał zrobić więcej. Rozważ w szczególności drugi link.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć widok SQL za pomocą SQLAlchemy?

  2. Jak znaleźć pierwsze darmowe godziny startu z rezerwacji w Postgres

  3. Funkcja MIN() w PostgreSQL

  4. Skopiuj strukturę tabeli do nowej tabeli

  5. Jak tworzyć i usuwać bazy danych i tabele w PostgreSQL