Comment puis-je l'insérer dans une table à partir d'une autre table par correspondance sur des valeurs?
Je suis en train de construire une simple application de la bibliothèque. J'ai eu une table appelée livres; parmi ses colonnes sont:
books:
book_id | integer | not null default nextval('books_book_id_seq'::regclass)
title | text | not null
author | text | not null default 'unknown'::text
Je n'avais pas prévu de faire quelque chose de spécial avec le nom des auteurs puisque tous je me soucie d'eux, ce sont leurs noms (donc pas de table de jointure, aucun des auteurs de table, etc.) MAINTENANT, cependant, je découvre que l'API de point de terminaison pour trouver des livres par auteur aura besoin d'une sorte d'id de l'auteur:
/browse/author/12345
au lieu de
/browse/author/Arthur%20C%20Clarke (or whatever)
J'ai créé un tableau distinct pour les auteurs:
authors:
author_id | integer | not null default nextval('authors_author_id_seq'::regclass)
author_name | text | not null
et le besoin de consulter, pour chaque ouvrage en ligne à son auteur via la colonne id. Je sais que je vais avoir besoin d'une clé étrangère, mais comme il n'y a pas de données dans la table livres je ne peux pas tout simplement une claque dans (toutes les valeurs null, etc) et, en tout cas, j'ai encore besoin d'obtenir toutes les id auteur et les insérer dans les lignes correctes.
Comment puis-je insérer la bonne author_ids dans les livres de la table basée sur la correspondance de la valeur dans les colonnes existantes? J'ai essayé:
insert into books (author_id) select author_id from authors where (books.author == authors.author_name);
Mais prévisible qui est trop naïve.
OriginalL'auteur whiterook6 | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
Vous pouvez rejoindre d'autres tables dans une
UPDATE
déclaration, en permettant préférable forme:Trois raisons:
C'est plus sûr. Votre requête sera d'écrire une valeur NULL dans chaque ligne où l'absence de correspondance de l'auteur est trouvé. Qui n'a pas vu de question dans votre cas, mais peut potentiellement conduire à la perte de données dans les requêtes semblables où vous avez déjà des données dans la colonne à mettre à jour.
Mon alternative ne fait rien si aucune correspondance n'auteur est trouvé.
C'est plus rapide. Le ci-dessus. Mais aussi parce que sous-requêtes corrélées comme vous avez l'échelle terriblement. Rejoindre dans une table est généralement plus rapide, surtout avec un peu plus que quelques lignes.
C'est plus propre et plus facilement adapté à d'autres colonnes.
OriginalL'auteur Erwin Brandstetter
dragonnet, déconner et j'ai réussi à répondre à ma propre question. Tout d'abord, c'est censé être une mise à jour (duh); deuxième:
OriginalL'auteur whiterook6