3 votes

En utilisant le type de données série comme clé étrangère

Supposons que j'ai deux tables.

La première est : table lists, avec list_id SERIAL, list_name TEXT

La deuxième table est, de manière triviale, une table qui indique si la liste est publique : list_id INT, is_public INT

Évidemment, c'est un exemple un peu artificiel, mais je suis en train de planifier quelques tables et cela semble être un problème. Si j'insère un nouveau list_name dans la table lists, alors cela me donnera un nouveau numéro de série... mais maintenant j'aurai besoin d'utiliser ce numéro de série dans la deuxième table. Évidemment dans ce cas, vous pourriez simplement ajouter is_public à la première table, mais dans le cas d'une liste de liens où vous avez une clé composite, vous devrez connaître la valeur de série qui a été renvoyée.

Comment les gens gèrent-ils habituellement cela? Récupèrent-ils le type de retour de l'insertion en utilisant le système avec lequel ils interagissent avec la base de données?

2voto

mu is too short Points 205090

Une approche pour ce genre de choses est :

Insérez dans la première table, utilisez lastval() pour obtenir la "valeur la plus récemment obtenue avec nextval pour une séquence" (dans la session actuelle), puis utilisez cette valeur pour construire votre prochaine insertion.

Il y a aussi INSERT ... RETURNING :

La clause RETURNING optionnelle fait en sorte que INSERT calcule et retourne les valeurs basées sur chaque ligne réellement insérée. C'est principalement utile pour obtenir des valeurs qui ont été fournies par défaut, comme un numéro de séquence.

Utiliser INSERT ... RETURNING id combine en gros les deux premières étapes ci-dessus en une seule, donc vous feriez :

  • INSERT ... RETURNING id
  • INSERT ...

où le second INSERT utiliserait l' id retourné par le premier INSERT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X