Eric B, la réponse est OK si vous souhaitez conserver un ou peut-être deux colonnes de la ligne existante. Si vous voulez préserver beaucoup de lignes, ça devient trop lourd rapide.
Voici une approche qui va à l'échelle de n'importe quel montant de colonnes de chaque côté. Pour l'illustrer, je vais supposer le schéma suivant:
CREATE TABLE page (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE,
title TEXT,
content TEXT,
author INTEGER NOT NULL REFERENCES user (id),
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Notez en particulier que name
est la clé naturelle de la ligne – id
est utilisé uniquement pour les clés étrangères, de sorte que le point est pour SQLite pour choisir la valeur de l'ID lui-même lors de l'insertion d'une nouvelle ligne. Mais lors de la mise à jour d'une ligne existante basée sur sa name
, je veux continuer à avoir de l'ancienne valeur de l'ID (évidemment!).
J'ai réaliser un vrai UPSERT
à la suite de construire:
INSERT OR REPLACE INTO page (id, name, title, content, author)
SELECT old.id, new.name, new.title, old.content, new.author
FROM ( SELECT
"about" AS name,
"About this site" AS title,
42 AS author
) AS new
LEFT JOIN (
SELECT id, name, content
FROM page
) AS old ON new.name = old.name;
Ici, si une ligne n'existaient pas précédemment old.id
sera NULLE et SQLite sera alors attribuer automatiquement un ID, mais si il y a déjà était telle ligne, old.id
ont une valeur réelle et ce sera réutilisé. Ce qui est exactement ce que je voulais.
En fait, c'est très souple. Notez comment l' ts
colonne est complètement absent sur tous les côtés – parce qu'il a un DEFAULT
de la valeur, SQLite va juste faire la bonne chose en tout cas, si je n'ai pas à prendre soin de moi-même.
Vous pouvez également inclure une colonne sur deux l' new
et old
côtés puis utiliser, par exemple, COALESCE(new.content, old.content)
dans l'avant - SELECT
- à-dire "insérer le nouveau contenu s'il y avait de tout, sinon conserver l'ancien contenu" – par exemple, si vous utilisez une requête fixe et sont obligatoires pour les nouvelles valeurs de remplacement.