PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Beberapa INSERTS menjadi satu tabel dan banyak ke banyak tabel

Anda dapat melakukan semuanya dalam satu Perintah SQL menggunakan CTE.

Dengan asumsi Postgres 9.6 dan skema klasik banyak-ke-banyak ini (karena Anda tidak menyediakannya):

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

Untuk menyisipkan tunggal pertanyaan dengan larik tag :

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 di sini

Ini membuat tag apa pun yang belum ada dengan cepat.

Representasi teks dari Array Postgres terlihat seperti ini:{tag1, tag2, tag3} .

Jika larik masukan dijamin memiliki tag yang berbeda, Anda dapat menghapus DISTINCT dari input_tags CTE .

penjelasan mendetail :

Jika Anda memiliki tulisan bersamaan Anda mungkin harus berbuat lebih banyak. Pertimbangkan tautan kedua secara khusus.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pakar yang sama dengan perilaku yang berbeda

  2. Spring Data JPA + Hibernate Lewati Terkunci baris (PostgreSQL)

  3. Apakah Django mengindeks kunci Autofield/ID di PostgreSQL?

  4. Bagaimana cara mengonversi postgres json ke integer

  5. Bagaimana cara mengindeks kolom array string untuk pg_trgm `'term' % APAPUN (array_column)` kueri?