Maison >base de données >tutoriel mysql >Comment puis-je insérer des données dans trois tables Postgres simultanément à l'aide d'une seule requête ?

Comment puis-je insérer des données dans trois tables Postgres simultanément à l'aide d'une seule requête ?

DDD
DDDoriginal
2025-01-12 14:38:42417parcourir

How Can I Insert Data into Three Postgres Tables Simultaneously Using a Single Query?

Utilisez Postgres pour insérer des données dans trois tables simultanément

Supposons que vous deviez insérer des données dans trois tables simultanément à l'aide d'une seule requête. La structure du tableau est la suivante :

<code class="language-sql">CREATE TABLE sample (
  id        bigserial PRIMARY KEY,
  lastname  varchar(20),
  firstname varchar(20)
);

CREATE TABLE sample1(
  user_id    bigserial PRIMARY KEY,
  sample_id  bigint REFERENCES sample,
  adddetails varchar(20)
);

CREATE TABLE sample2(
  id      bigserial PRIMARY KEY,
  user_id bigint REFERENCES sample1,
  value   varchar(10)
);</code>

Vous devez garantir la clé primaire pour chaque insertion, puis l'utiliser dans les tableaux suivants. Cependant, l'exécution d'une seule requête pour chaque insertion ne permet pas une réutilisation immédiate des valeurs clés.

Solution : Modification des données CTE

Afin d'insérer des données dans trois tables simultanément, vous pouvez utiliser une modification de données CTE (Common Table Expression). Ils établissent des dépendances entre insertions consécutives :

<code class="language-sql">WITH ins1 AS (
  INSERT INTO sample(firstname, lastname)
  VALUES ('fai55', 'shaggk')
  RETURNING id AS sample_id
), ins2 AS (
  INSERT INTO sample1 (sample_id, adddetails)
  SELECT sample_id, 'ss' FROM ins1
  RETURNING user_id
)
INSERT INTO sample2 (user_id, value)
SELECT user_id, 'ss2' FROM ins2;</code>

Le premier CTE, ins1, s'insère dans la table exemple et renvoie la clé générée (sample_id). Ensuite, ins2 s'insère dans sample1 en utilisant le sample_id de ins1 et renvoie le user_id. Enfin, le troisième INSERT s'insère dans sample2 en utilisant user_id.

Fournir les données à l'avance

Il est généralement plus efficace de définir au préalable les lignes de données dans le CTE :

<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS (
  VALUES
    ('fai55', 'shaggk', 'ss', 'ss2'),
    ('fai56', 'XXaggk', 'xx', 'xx2')
)
...
-- (查询的其余部分保持不变)</code>

N'oubliez pas de prendre en compte des facteurs tels que les contraintes d'unicité, les conversions de types et la gestion des écritures simultanées pour garantir l'intégrité des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn