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
Libérer: 2025-01-12 14:38:42
original
424 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal