sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL multi INSERT...RETURNING s více sloupci

Použijte CTE upravující data k řetězení vašich tří INSERTů. Něco jako toto:

WITH ins1 AS (
   INSERT INTO table1 (username, name,  surname)
   VALUES ('johnee','john','smith')
   RETURNING user_id
   )
, ins2 AS (
   INSERT INTO table2 (user_id, password)
   SELECT ins1.user_id, 'secret'
   FROM   ins1                            -- nothing to return here
   )
INSERT INTO table3 (user_id, adress, city, phone)
SELECT ins1.user_id, ...
FROM   ins1
RETURNING user_id;
  • Obvykle je nejlepší přidat seznam definic sloupců pro INSERT s (kromě zvláštních případů). V opačném případě, pokud se struktura tabulky změní, váš kód se může překvapivým způsobem zlomit.

  • Vynechal jsem sloupce, do kterých byste zadali pouze DEFAULT . Výchozí hodnoty se vkládají automaticky. Kratší, stejný výsledek.

  • Poslední, nepovinné RETURNING vrátí výsledné user_id - zjevně ze sekvence nebo nějakého jiného výchozího nastavení. Ve skutečnosti je to user_id z table3 , ale to je stejné, pokud nemáte nějaké spouštěče nebo jiné magické překážky.

Více o CTE upravujících data (také znám jako „zapisovatelné“):

  • Jsou dotazy typu SELECT jediným typem, který lze vnořit?


  1. 40 otázek, které musíte vědět o R12.2

  2. Paralelní volání v PL/SQL

  3. PostgreSQL pole prvků, z nichž každý je cizí klíč

  4. Jak vypnu vypršení platnosti hesla Oracle?