web-dev-qa-db-fra.com

Insérer dans plusieurs tables avec une seule requête

Je voudrais ajouter des données à au moins trois tables avec une seule requête. J'ai pensé à quelque chose comme ça:

WITH ins AS (
  INSERT INTO core.adr
    (street, "number", postal_code, city)
  VALUES
    ('test 1', '25a', '00912', 'villageman')
  RETURNING id)
INSERT INTO core.adr_information
  (idref, info)
SELECT id, 'test data'
FROM ins;

qui fonctionne parfaitement pour exactement deux tables.

Le problème principal ici est que toutes les requêtes supplémentaires nécessitent la valeur id de la première requête INSERT, ce qui ne semble pas gérable de cette façon. Je pense que cela pourrait être facilement fait avec une procédure stockée ou une transaction, mais je voudrais que la solution soit une requête simple et solide.

Suis-je en train d'oublier quelque chose? Est-ce possible de cette façon ou d'une autre (pas de procédures stockées * ou de transactions)?


Remarque

* Bien qu'à proprement parler, Postgres ne possède pas ont des procédures stockées, seulement des fonctions, comme @ Erwin Brandstetter à juste titre souligné dans les commentaires. Voir cette série de messages pour des informations pertinentes .

9
maxik

Je pense que vous pouvez facilement empiler les CTE les uns sur les autres, comme ceci:

WITH ins AS (
  INSERT INTO core.adr
    (street, "number", postal_code, city)
  VALUES
    ('test 1', '25a', '00912', 'villageman')
  RETURNING id),
ins2 AS (
  INSERT INTO someothertable
    (id, something)
  SELECT id, 'something' FROM ins
  RETURNING id -- this is necessary for CTE, but not used
)
INSERT INTO core.adr_information
  (idref, info)
SELECT id, 'test data'
FROM ins;
4
mustaccio